List of Hash - text.Baldanders.info
tag:text.Baldanders.info,2021-08-23:/tags
2021-08-23T23:07:22+09:00
帰ってきた「しっぽのさきっちょ」
https://text.baldanders.info/images/avatar.jpg
https://text.baldanders.info/images/avatar.jpg
GNKF: NKF ぽいなにか の v0.6.0 をリリースした
tag:text.Baldanders.info,2021-08-23:/release/2021/08/gnkf-v0_6_0-is-released/
2021-08-23T14:07:22+00:00
2021-12-04T02:40:05+00:00
指定した文字列を BCrypt アルゴリズムで符号化する機能を追加した。悪用しないように(笑)
Spiegel
https://baldanders.info/profile/
<p><a href="https://go.dev/">Go 言語</a>における文字列処理の習作 <a href="https://github.com/spiegel-im-spiegel/gnkf" title="spiegel-im-spiegel/gnkf: Network Kanji Filter by Golang">gnkf</a> の v0.6.0 をリリースした。</p>
<ul>
<li><a href="https://github.com/spiegel-im-spiegel/gnkf/releases/tag/v0.6.0">Release v0.6.0 · spiegel-im-spiegel/gnkf · GitHub</a></li>
</ul>
<p>このバージョンで指定した文字列を BCrypt アルゴリズムで符号化する機能を追加した。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gnkf bcrypt -h
</span></span><span class="line"><span class="cl">Hash and compare by BCrypt.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Usage:
</span></span><span class="line"><span class="cl"> gnkf bcrypt [flags] string [string...]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Aliases:
</span></span><span class="line"><span class="cl"> bcrypt, bc
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Flags:
</span></span><span class="line"><span class="cl"> --compare string compare to BCrypt hashed string
</span></span><span class="line"><span class="cl"> -c, --cost int BCrypt cost (4-31) (default 10)
</span></span><span class="line"><span class="cl"> -h, --help help for bcrypt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Global Flags:
</span></span><span class="line"><span class="cl"> --debug for debug
</span></span></code></pre></div><p>こんな感じで使う。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gnkf bc password
</span></span><span class="line"><span class="cl">$2a$10$ES0KxMf9p.t0FEMp8WB6we8X43rMzfXb9r5WvFeUSk8Q2z3wdjrCS
</span></span></code></pre></div><p>符号化した文字列を検証することもできる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gnkf bc --compare '$2a$10$ES0KxMf9p.t0FEMp8WB6we8X43rMzfXb9r5WvFeUSk8Q2z3wdjrCS' foo bar password
</span></span><span class="line"><span class="cl">compare BCrypt hashed string '$2a$10$ES0KxMf9p.t0FEMp8WB6we8X43rMzfXb9r5WvFeUSk8Q2z3wdjrCS' to...
</span></span><span class="line"><span class="cl">foo : crypto/bcrypt: hashedPassword is not the hash of the given password
</span></span><span class="line"><span class="cl">bar : crypto/bcrypt: hashedPassword is not the hash of the given password
</span></span><span class="line"><span class="cl">password : match!
</span></span></code></pre></div><p>いやね。
最初は Java のパスワード処理を検証するミニツールを作ってたんだけど,符号化するところだけチェックすればいいのなら <a href="https://github.com/spiegel-im-spiegel/gnkf" title="spiegel-im-spiegel/gnkf: Network Kanji Filter by Golang">gnkf</a> に組み込んじゃえばいいぢゃん,と思いついて「えいやっ」で組み込んでしまった。
反省はしない。</p>
<p>悪用しないように(笑)</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://text.baldanders.info/release/gnkf/">GNKF: Network Kanji Filter by Golang</a></li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/416Stewy0NS._SL160_.jpg" width="123" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラミング言語Go</a></dt>
<dd>アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)</dd>
<dd>丸善出版 2016-06-20 (Release 2021-07-13)</dd>
<dd>Kindle版</dd>
<dd>B099928SJD (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想は<a href="https://text.baldanders.info/remark/2016/07/go-programming-language/" >こちら</a>。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2021-05-22">2021-05-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- プログラミング言語Go -->
GNKF: NKF ぽいなにか の v0.5.0 をリリースした
tag:text.Baldanders.info,2021-05-23:/release/2021/05/gnkf-v0_5_0-is-released/
2021-05-23T05:11:55+00:00
2021-12-04T02:40:05+00:00
データのハッシュ値を取得・検証する機能を追加した。
Spiegel
https://baldanders.info/profile/
<p><a href="https://go.dev/">Go 言語</a>における文字列処理の習作 <a href="https://github.com/spiegel-im-spiegel/gnkf" title="spiegel-im-spiegel/gnkf: Network Kanji Filter by Golang">gnkf</a> の v0.5.0 をリリースした。</p>
<ul>
<li><a href="https://github.com/spiegel-im-spiegel/gnkf/releases/tag/v0.5.0">Release v0.5.0 · spiegel-im-spiegel/gnkf · GitHub</a></li>
</ul>
<p>このバージョンでデータのハッシュ値を取得・検証する機能を追加した。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gnkf hash -h
</span></span><span class="line"><span class="cl">Print or check hash value.
</span></span><span class="line"><span class="cl"> Support algorithm:
</span></span><span class="line"><span class="cl"> MD5, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Usage:
</span></span><span class="line"><span class="cl"> gnkf hash [flags] [file]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Aliases:
</span></span><span class="line"><span class="cl"> hash, h
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Flags:
</span></span><span class="line"><span class="cl"> -a, --algorithm string hash algorithm (default "SHA-256")
</span></span><span class="line"><span class="cl"> -c, --check don't fail or report status for missing files
</span></span><span class="line"><span class="cl"> -h, --help help for hash
</span></span><span class="line"><span class="cl"> --ignore-missing don't fail or report status for missing files (with check option)
</span></span><span class="line"><span class="cl"> --quiet don't print OK for each successfully verified file (with check option)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Global Flags:
</span></span><span class="line"><span class="cl"> --debug for debug
</span></span></code></pre></div><p>MD5, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, および SHA-512/256 各アルゴリズムに対応している<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。
既定のアルゴリズムは SHA-256 で,それ以外を使う場合は</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ echo Hello World | gnkf h -a md5
</span></span><span class="line"><span class="cl">e59ff97941044f85df5297e1c302d260 -
</span></span></code></pre></div><p>などとアルゴリズム名を指定する。</p>
<p>また,リリースファイルに対して <a href="https://github.com/spiegel-im-spiegel/gnkf/releases/download/v0.5.0/gnkf_0.5.0_checksums.txt"><code>gnkf_0.5.0_checksums.txt</code></a> のようなハッシュ値の情報があれば, <code>-c</code> オプションを使って</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ curl -L https://github.com/spiegel-im-spiegel/gnkf/releases/download/v0.5.0/gnkf_0.5.0_checksums.txt -O
</span></span><span class="line"><span class="cl">$ curl -L https://github.com/spiegel-im-spiegel/gnkf/releases/download/v0.5.0/gnkf_0.5.0_Linux_64bit.tar.gz -O
</span></span><span class="line"><span class="cl">$ gnkf h --ignore-missing -c gnkf_0.5.0_checksums.txt
</span></span><span class="line"><span class="cl">gnkf_0.5.0_Linux_64bit.tar.gz: OK
</span></span><span class="line"><span class="cl">WARNING in 9 items: no such file or directory
</span></span></code></pre></div><p>といった感じにダウンロードしたファイルの検証を行うことができる。</p>
<p>まぁ Linux とかなら <code>sha256sum</code> コマンド等を使えばいいのだけど, Windows 環境で互換性のあるコマンドが見当たらなかったので <a href="https://github.com/spiegel-im-spiegel/gnkf" title="spiegel-im-spiegel/gnkf: Network Kanji Filter by Golang">gnkf</a> に組み込んでみたのだった。
以前に <a href="https://text.baldanders.info/release/2020/10/gnkf-v0_2_0-is-released/">BASE64 符号化のサブコマンド</a>を組み込んだことがあったので,これもありかなと(笑)</p>
<p>余談だが <a href="https://go.dev/">Go</a> で MD5 や SHA-1 アルゴリズムを使うと <a href="https://github.com/securego/gosec" title="securego/gosec: Golang security checker">gosec</a> に叱られる。
これを回避するには G501 および G505 のワーニングを除外すればよい。</p>
<p>たとえば</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ golangci-lint run --enable gosec --exclude "G501|G505"
</span></span></code></pre></div><p>みたいな感じ。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://text.baldanders.info/release/gnkf/">GNKF: Network Kanji Filter by Golang</a></li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/416Stewy0NS._SL160_.jpg" width="123" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラミング言語Go</a></dt>
<dd>アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)</dd>
<dd>丸善出版 2016-06-20 (Release 2021-07-13)</dd>
<dd>Kindle版</dd>
<dd>B099928SJD (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想は<a href="https://text.baldanders.info/remark/2016/07/go-programming-language/" >こちら</a>。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2021-05-22">2021-05-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- プログラミング言語Go -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>SHA-3 は標準パッケージにないので今回は見送った。ちなみに <a href="https://pkg.go.dev/golang.org/x/crypto/sha3" title="sha3 · pkg.go.dev"><code>golang.org/x/crypto/sha3</code></a> パッケージを使えば SHA-3 アルゴリズムも簡単に組み込める。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
OpenSSH 完全に理解した(笑)
tag:text.Baldanders.info,2021-01-11:/remark/2021/01/openssh-mystery/
2021-01-11T07:31:17+00:00
2021-02-18T13:26:40+00:00
どうやら OpenSSH に対する理解が足りないと気付いたので,知ってること気付いたこと等を書き出してみる。
Spiegel
https://baldanders.info/profile/
<p>使ってみたかったんだ,このフレーズ(笑)</p>
<p>めでたくも<a href="https://text.baldanders.info/remark/2020/12/github-discussions/" title="ようやく Disqus を捨てれるよ">フィードバック先移行</a>後,はじめてのフィードバックを頂いた。
どうやら <a href="https://www.openssh.com/">OpenSSH</a> に対する理解が足りないと気付いたので,知ってること気付いたこと等を書き出してみる。</p>
<p>「ここ違うよ」とかいうのがありましたら<a href="https://github.com/spiegel-im-spiegel/github-pages-env/discussions" title="Discussions · spiegel-im-spiegel/github-pages-env">フィードバック</a>にてご指摘いただけると有り難いです。</p>
<p><a href="https://www.openssh.com/">OpenSSH</a> に関する本とかあればよかったんだけどねぇ。
日本語の本はみんな出版年がエラく古いし,しかも「使い方」は書いてあっても中で何してるかについてはあまり言及されてない感じ? とっかに「Inside OpenSSH」みたいな本があればいいのに(笑)</p>
<h2><a href="https://www.openssh.com/">OpenSSH</a> 暗号化通信の手順</h2>
<p><a href="https://www.openssh.com/">OpenSSH</a> におけるサーバ-クライアント間の暗号化通信の手順は大雑把に</p>
<ol>
<li>サーバ-クライアント間で使える暗号スイートの確認</li>
<li>鍵交換アルゴリズムによるシークレットの導出とセッション鍵の生成
<ul>
<li>ホスト鍵を使ったホスト認証(ユーザからホストを認証する)も併せて行う</li>
</ul>
</li>
<li>セッション鍵による暗号化通信の開始</li>
<li>クライアント認証</li>
</ol>
<p>となっているようだ。
以降でひとつづつ見ていこう。</p>
<h2>鍵交換アルゴリズムとハッシュ・アルゴリズム</h2>
<p>暗号化通信を行うためにはサーバ-クライアント間でセッション鍵(共通鍵)を共有する必要がある。
(昔はともかく)今の <a href="https://www.openssh.com/">OpenSSH</a> ではセッション鍵の取得に Diffie-Hellman 鍵交換アルゴリズムまたはそのバリエーションを使う。
Diffie-Hellman 鍵交換アルゴリズムは公開鍵暗号の一種だがセッションの開始ごとに使い捨ての鍵ペアを生成する(筈)ので,ユーザがそれを意識することはないだろう。</p>
<p>鍵交換アルゴリズムで得られる共有データを「シークレット」と呼ぶことがある。
<a href="https://www.openssh.com/">OpenSSH</a> ではシークレットをハッシュ化した値をセッション鍵として使っているようだ。</p>
<p>したがってセッション鍵の共有には鍵交換アルゴリズムとハッシュ・アルゴリズムの2つが必要となる。
<a href="https://www.openssh.com/">OpenSSH</a> でサポートしてる暗号スイートは以下の通り。</p>
<table>
<thead>
<tr>
<th>名称</th>
<th>鍵交換</th>
<th>ハッシュ</th>
<th style="text-align:center">推奨</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>curve25519-sha256</code></td>
<td>ECDH (curve25519)</td>
<td>SHA2-256</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 7.4 以降</td>
</tr>
<tr>
<td><code>diffie-hellman-group1-sha1</code></td>
<td>DH (1024 bits)</td>
<td>SHA1</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>diffie-hellman-group14-sha1</code></td>
<td>DH (2048 bits)</td>
<td>SHA1</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>diffie-hellman-group14-sha256</code></td>
<td>DH (2048 bits)</td>
<td>SHA2-256</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 7.3 以降</td>
</tr>
<tr>
<td><code>diffie-hellman-group16-sha512</code></td>
<td>DH (4096 bits)</td>
<td>SHA2-512</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 7.3 以降</td>
</tr>
<tr>
<td><code>diffie-hellman-group18-sha512</code></td>
<td>DH (8192 bits)</td>
<td>SHA2-512</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 7.3 以降</td>
</tr>
<tr>
<td><code>diffie-hellman-group-exchange-sha1</code></td>
<td>Custom DH (?)</td>
<td>SHA1</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>diffie-hellman-group-exchange-sha256</code></td>
<td>Custom DH (?)</td>
<td>SHA2-256</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 5.4 以降</td>
</tr>
<tr>
<td><code>ecdh-sha2-nistp256</code></td>
<td>ECDH (NIST curve P-256)</td>
<td>SHA2-256</td>
<td style="text-align:center"></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 5.7 以降</td>
</tr>
<tr>
<td><code>ecdh-sha2-nistp384</code></td>
<td>ECDH (NIST curve P-384)</td>
<td>SHA2-256</td>
<td style="text-align:center"></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 5.7 以降</td>
</tr>
<tr>
<td><code>ecdh-sha2-nistp521</code></td>
<td>ECDH (NIST curve P-521)</td>
<td>SHA2-256</td>
<td style="text-align:center"></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 5.7 以降</td>
</tr>
</tbody>
</table>
<p>SHA-1 は危殆化が叫ばれて久しく,既に推奨されていない。
このブログでもあちこちで書いているが Zenn の以下の記事でまとめているので興味のある人はどうぞ。</p>
<ul>
<li><a href="https://zenn.dev/spiegel/articles/20201025-sayonara-sha1">さようなら SHA-1</a></li>
</ul>
<p>ECDH (Elliptic Curve Diffie–Hellman) は Diffie-Hellman 鍵交換アルゴリズムの楕円曲線版と考えてもらって構わない。</p>
<p>ECDH で使用する楕円曲線のうち NIST 推奨パラメータ(curve P-256/384/521)は微妙に評判が悪いようで,推奨しないところがあった。
どうも NIST 発のアルゴリズムは使いたくないということのようだ。
まぁ NSA 絡みで度々やらかしてるから信用がないんだろうな(笑)</p>
<p>これらの暗号スイートの選択と優先順位はサーバ側で設定するのでユーザが意識することはない。
強いて言うなら古いバージョンは使うなってことくらいか。</p>
<h3>鍵交換とホスト認証【2021-02-18 追記】</h3>
<p>フィードバックで<a href="https://github.com/spiegel-im-spiegel/github-pages-env/discussions/92">教えていただいた</a>が,最近の <a href="https://www.openssh.com/">OpenSSH</a> では鍵交換のプロセスにホスト認証を混ぜて行っているようだ。
ホスト認証については以下の記事が参考になる。</p>
<ul>
<li><a href="https://qiita.com/angel_p_57/items/30a12a0d45457b5f76d5">SSHのハイブリッド暗号に関する良くある誤解の話 - Qiita</a></li>
</ul>
<p>使い捨ての鍵ペアを使う ephemeral な DH や ECDH では「なりすまし」の問題があるため,ユーザとホストの間での相互認証がどうしても必要となる。
ホスト認証に使うホスト鍵はあらかじめサーバ側で用意するのだが,このホスト鍵(の公開鍵)の電子指紋をつかって鍵自体の証明を行うようだ。
このような信用モデルのことを <a href="https://en.wikipedia.org/wiki/Trust_on_first_use" title="Trust on first use - Wikipedia">TOFU (Trust On First Use)</a> と呼ぶ。
クライアント側は接続時にホスト鍵(の公開鍵)の電子指紋をチェックして以前と変わっていれば警告を出す。</p>
<p>ホスト認証に使える電子署名アルゴリズムはクライアント認証で使う暗号スイートと同じようだ。
なので「<a href="#ds">電子署名アルゴリズムとハッシュ・アルゴリズム</a> 」の節を参照してほしい。</p>
<h2>共通鍵暗号アルゴリズムと暗号モード</h2>
<p>実際の暗号化通信はセッション鍵を使った共通鍵暗号アルゴリズムで行う。
<a href="https://www.openssh.com/">OpenSSH</a> でサポートしてる共通鍵暗号アルゴリズムと暗号モードは以下の通り。</p>
<table>
<thead>
<tr>
<th>名称</th>
<th>共通鍵暗号</th>
<th>暗号モード</th>
<th style="text-align:center">推奨</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>3des-cbc</code></td>
<td>TripleDES</td>
<td>CBC</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>aes128-cbc</code></td>
<td>AES-128</td>
<td>CBC</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>aes192-cbc</code></td>
<td>AES-192</td>
<td>CBC</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>aes256-cbc</code></td>
<td>AES-256</td>
<td>CBC</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>aes128-ctr</code></td>
<td>AES-128</td>
<td>CTR</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td></td>
</tr>
<tr>
<td><code>aes192-ctr</code></td>
<td>AES-192</td>
<td>CTR</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td></td>
</tr>
<tr>
<td><code>aes256-ctr</code></td>
<td>AES-256</td>
<td>CTR</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td></td>
</tr>
<tr>
<td><code>aes128-gcm</code>@openssh.com</td>
<td>AES-128</td>
<td>GCM</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 6.2 以降</td>
</tr>
<tr>
<td><code>aes256-gcm</code>@openssh.com</td>
<td>AES-256</td>
<td>GCM</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 6.2 以降</td>
</tr>
<tr>
<td><code>arcfour</code></td>
<td>ARCFOUR (40?)</td>
<td>—</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>arcfour128</code></td>
<td>ARCFOUR (128)</td>
<td>—</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>arcfour256</code></td>
<td>ARCFOUR (256)</td>
<td>—</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>blowfish-cbc</code></td>
<td>Blowfish (64)</td>
<td>CBC</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>cast128-cbc</code></td>
<td>CAST (128)</td>
<td>CBC</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>chacha20-poly1305</code>@openssh.com</td>
<td>ChaCha20</td>
<td>Poly1305</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 6.5 以降</td>
</tr>
</tbody>
</table>
<p>ARCFOUR ってのはいわゆる RC4 ストリーム暗号のこと。
RC4 は公式にはアルゴリズムを公開していないため “Alleged RC FOUR” の意味で ARCFOUR という名称が使われているようだ。</p>
<p>RC4 および CBC モードは危殆化が報告されて久しく,推奨されない。
また TripleDES, Blowfish, CAST はセキュリティ強度不足のため,これも推奨されない。</p>
<p>優先順位としては AEAD (Authenticated Encryption with Associated Data; 認証付き暗号) として機能する GCM や ChaCha20-Poly1305 がより推奨されているらしい。
なお,これらの暗号スイートの選択と優先順位はサーバ側で設定するのでユーザが意識することはない。</p>
<h2>メッセージ認証符号</h2>
<p>GCM や ChaCha20-Poly1305 以外の AEAD として機能しない暗号モードの場合は MAC (Message Authentication Code; メッセージ認証符号) を組み合わせる。
組み合わせ方としては</p>
<ul>
<li>Encrypt-then-MAC (<a href="https://www.openssh.com/">OpenSSH</a> 6.2 以降)</li>
<li>MAC-then-encrypt</li>
<li>Encrypt-and-MAC</li>
</ul>
<p>のいずれかを選択できるらしい。
Encrypt-then-MAC であれば AEAD として機能する。
<a href="https://www.openssh.com/">OpenSSH</a> でサポートしてる MAC アルゴリズムとハッシュ・アルゴリズムの組み合わせは以下の通り。</p>
<table>
<thead>
<tr>
<th>名称</th>
<th>MAC</th>
<th>ハッシュ</th>
<th style="text-align:center">推奨</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>hmac-md5</code></td>
<td>HMAC</td>
<td>MD5</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>hmac-md5-96</code></td>
<td>HMAC</td>
<td>MD5</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>hmac-sha1</code></td>
<td>HMAC</td>
<td>SHA1</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>hmac-sha1-96</code></td>
<td>HMAC</td>
<td>SHA1</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>hmac-sha2-256</code></td>
<td>HMAC</td>
<td>SHA2-256</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 5.9 以降</td>
</tr>
<tr>
<td><code>hmac-sha2-512</code></td>
<td>HMAC</td>
<td>SHA2-512</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 5.9 以降</td>
</tr>
<tr>
<td><code>umac-64</code></td>
<td>UMAC-64</td>
<td>(Universal Hash)</td>
<td style="text-align:center"></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 4.7 以降</td>
</tr>
<tr>
<td><code>umac-128</code></td>
<td>UMAC-128</td>
<td>(Universal Hash)</td>
<td style="text-align:center"></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 6.2 以降</td>
</tr>
</tbody>
</table>
<p>それぞれの名称の後ろに <code>-etm</code>@openssh.com と付くと Encrypt-then-MAC で動作する。</p>
<p>MD5 は危殆化が報告されて久しく,推奨されない。
SHA1 は HMAC に関しては2031年以降も “Acceptable” であるとされているが,他の暗号スイートとの組み合わせで考えると避けたほうがいいかもしれない。</p>
<p>UMAC は <a href="https://tools.ietf.org/html/rfc4418" title="RFC 4418 - UMAC: Message Authentication Code using Universal Hashing">RFC 4418</a> で規定されている。
この中で</p>
<figure lang="en">
<blockquote><q>Likewise, 32-, 96-, and 128-bit tags cannot be forged with more than 1/2^30, 1/2^90, and 1/2^120 probability plus the probability of a successful attack against AES as a pseudorandom permutation</q>.</blockquote>
<figcaption><div>via <q><a href="https://tools.ietf.org/html/rfc4418">UMAC: Message Authentication Code using Universal Hashing</a></q></div></figcaption>
</figure>
<p>とあるので UMAC-64 や UMAC-128 はセキュリティ強度不足なんじゃないかと思うのだが,どうだろう。</p>
<p>これらの暗号スイートの選択と優先順位はサーバ側で設定するのでユーザが意識することはない。</p>
<h2 id="ds">電子署名アルゴリズムとハッシュ・アルゴリズム</h2>
<p>クライアント認証で公開鍵暗号を用いる場合は,ユーザ側で認証鍵ペアを生成し,公開鍵をあらかじめサーバ側と共有する必要がある。
また公開鍵暗号を用いたクライアント認証ではハッシュ・アルゴリズムも用いる。
<a href="https://www.openssh.com/">OpenSSH</a> でサポートしてるクライアント認証の暗号スイートは以下の通り。</p>
<table>
<thead>
<tr>
<th>名称(サーバ側)</th>
<th>電子署名</th>
<th>ハッシュ</th>
<th style="text-align:center">推奨</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ssh-ed25519</code></td>
<td>EdDSA (edwards25519)</td>
<td>SHA2-256</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td></td>
</tr>
<tr>
<td><code>sk-ssh-ed25519</code>@openssh.com</td>
<td>EdDSA (edwards25519)</td>
<td>SHA2-256</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 8.2 以降</td>
</tr>
<tr>
<td><code>ssh-rsa</code></td>
<td>RSA</td>
<td>SHA1</td>
<td style="text-align:center"></td>
<td>廃止予定</td>
</tr>
<tr>
<td><code>rsa-sha2-256</code></td>
<td>RSA</td>
<td>SHA2-256</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 7.2 以降</td>
</tr>
<tr>
<td><code>rsa-sha2-512</code></td>
<td>RSA</td>
<td>SHA2-512</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 7.2 以降</td>
</tr>
<tr>
<td><code>ssh-dss</code></td>
<td>DSA</td>
<td>SHA1</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>ecdsa-sha2-nistp256</code></td>
<td>ECDSA (NIST curve P-256)</td>
<td>SHA2-256</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>ecdsa-sha2-nistp384</code></td>
<td>ECDSA (NIST curve P-384)</td>
<td>SHA2-384</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>ecdsa-sha2-nistp521</code></td>
<td>ECDSA (NIST curve P-521)</td>
<td>SHA2-512</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>sk-ecdsa-sha2-nistp256</code>@openssh.com</td>
<td>ECDSA (NIST curve P-256)</td>
<td>SHA2-256</td>
<td style="text-align:center"></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 8.2 以降</td>
</tr>
</tbody>
</table>
<p>頭に <code>sk-</code> が付いているものは暗号デバイスに対応している。</p>
<p><code>ssh-rsa</code> は将来バージョンで廃止が決まっている。</p>
<p><a href="https://www.openssh.com/">OpenSSH</a> では FIPS 186-3 以降の DSA に対応してないようで,鍵長が1024ビットしか対応してない(これも NIST 嫌悪か?)。
もちろん推奨できない。</p>
<p>NIST 推奨パラメータを使った ECDSA も(ECDH と同じく)微妙に評判が悪い。
あと ECDSA は電子署名時に乱数を使うのだが,この実装をサボると脆弱性の元となる。
実際に,2013年に発覚した<a href="https://www.cryptrec.go.jp/topics/cryptrec-er-0001-2013.html" title="擬似乱数生成アルゴリズム Dual_EC_DRBG について | CRYPTREC">疑似乱数生成器 Dual EC DRBG の脆弱性</a>では, NSA が絡んでいたこともあって,一気に ECDSA 忌避が強まったらしい。</p>
<p>以上はサーバ側の設定の話だが,ユーザ側では <code>ssh-keygen</code> コマンドを使って認証鍵を生成する必要がある。</p>
<p>認証鍵の生成では鍵種別(<code>-t</code> オプション)と鍵長(<code>-b</code> オプション)を指定する。
組み合わせは以下の通り。</p>
<table>
<thead>
<tr>
<th>鍵種別</th>
<th>鍵長</th>
<th>アルゴリズム</th>
<th style="text-align:center">推奨</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>rsa</code></td>
<td>1024以上<br>(既定3072)</td>
<td>RSA</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td>3072ビット以上推奨</td>
</tr>
<tr>
<td><code>dsa</code></td>
<td>1024</td>
<td>DSA</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>ed25519</code></td>
<td>—</td>
<td>EdDSA (edwards25519)</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td></td>
</tr>
<tr>
<td><code>ed25519-sk</code></td>
<td>—</td>
<td>EdDSA (edwards25519)</td>
<td style="text-align:center"><span><i class="fa-solid fa-check"></i></span></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 8.2 以降</td>
</tr>
<tr>
<td><code>ecdsa</code></td>
<td>256(既定)</td>
<td>ECDSA (NIST curve P-256)</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>ecdsa</code></td>
<td>384</td>
<td>ECDSA (NIST curve P-384)</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>ecdsa</code></td>
<td>521</td>
<td>ECDSA (NIST curve P-521)</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td><code>ecdsa-sk</code></td>
<td>—</td>
<td>ECDSA (NIST curve P-256)</td>
<td style="text-align:center"></td>
<td><a href="https://www.openssh.com/">OpenSSH</a> 8.2 以降</td>
</tr>
</tbody>
</table>
<p>これは私が盛大に勘違いしていたのだが,たとえば</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ ssh-keygen -t rsa
</span></span><span class="line"><span class="cl">Generating public/private rsa key pair.
</span></span><span class="line"><span class="cl">Enter file in which to save the key (/home/username/.ssh/id_rsa):
</span></span><span class="line"><span class="cl">Enter passphrase (empty for no passphrase):
</span></span><span class="line"><span class="cl">Enter same passphrase again:
</span></span><span class="line"><span class="cl">Your identification has been saved in /home/username/.ssh/id_rsa
</span></span><span class="line"><span class="cl">Your public key has been saved in /home/username/.ssh/id_rsa.pub
</span></span><span class="line"><span class="cl">The key fingerprint is:
</span></span><span class="line"><span class="cl">SHA256:qufsNjgco3QZNjE4eupwQiT6mD8fr2a7nXmU3ybxFHo username@hostname
</span></span><span class="line"><span class="cl">The key's randomart image is:
</span></span><span class="line"><span class="cl">+---[RSA 3072]----+
</span></span><span class="line"><span class="cl">| . |
</span></span><span class="line"><span class="cl">|..o o |
</span></span><span class="line"><span class="cl">|+. . o |
</span></span><span class="line"><span class="cl">|o.. + . |
</span></span><span class="line"><span class="cl">|.* . + S. . . |
</span></span><span class="line"><span class="cl">|* + = .o o E |
</span></span><span class="line"><span class="cl">|o= +.+.. . * |
</span></span><span class="line"><span class="cl">| .+ **+o. o + |
</span></span><span class="line"><span class="cl">| =*XOo o |
</span></span><span class="line"><span class="cl">+----[SHA256]-----+
</span></span></code></pre></div><p>てな感じに鍵を作ったときに表示される <code>SHA256</code> は署名時ではなく,鍵指紋のハッシュ・アルゴリズムを指しているらしい。
実際の電子署名でどのハッシュ・アルゴリズムを使うのかはサーバ-クライアント間のネゴシエーションで決まるのかな(?)</p>
<h2>【おまけ】 各種アルゴリズムのセキュリティ強度</h2>
<p>(「<a href="https://text.baldanders.info/remark/2017/10/key-parameters/">暗号鍵関連の各種変数について</a>」より抜粋)</p>
<p>おまけとして各種アルゴリズムのセキュリティ強度を挙げておく。</p>
<h3>各種暗号アルゴリズムとセキュリティ強度の関係</h3>
<p>最初は種暗号アルゴリズムの鍵長とセキュリティ強度の関係を示す表。
単位は全てビットである。</p>
<p><figure lang="en">
<style>
main table.nist2 th {
vertical-align:middle;
text-align: center;
}
main table.nist2 td {
vertical-align:middle;
text-align: center;
}
</style>
<table class="nist2">
<thead>
<tr>
<th>Security<br>Strength</th>
<th>Symmetric<br> key<br> algorithms</th>
<th>FFC<br>(DSA, DH,<br>MQV)</th>
<th>IFC<br>(RSA)</th>
<th>ECC<br>(ECDSA,<br>EdDSA, DH,<br>MQV)</th>
</tr>
</thead>
<tbody>
<tr><td> $\le 80$ </td><td>2TDEA</td><td> $L=1024$ <br> $N=160$ </td><td> $k=1024$ </td> <td> $f = 160\text{ - }223$ </td></tr>
<tr><td> $112$ </td><td>3TDEA</td><td> $L=2048$ <br> $N=224$ </td><td>$k=2048$</td> <td>$f = 224\text{ - }255$</td></tr>
<tr><td> $128$ </td><td>AES-128</td><td> $L=3072$ <br> $N=256$ </td><td>$k=3072$</td> <td>$f = 256\text{ - }383$</td></tr>
<tr><td> $192$ </td><td>AES-192</td><td> $L=7680$ <br> $N=384$ </td><td>$k=7680$</td> <td>$f = 384\text{ - }511$</td></tr>
<tr><td> $256$ </td><td>AES-256</td><td> $L=15360$ <br> $N=512$ </td><td>$k=15360$</td><td>$f=512+$</td></tr>
</tbody>
</table>
<figcaption><div>Comparable security strengths of symmetric block cipher and asymmetric-key algorithms (via <q><a href='https://doi.org/10.6028/NIST.SP.800-57pt1r5'>SP 800-57 Part 1 Revision 5 <sup><i class='far fa-file-pdf'></i></sup></a></q> 5.6.1.1)</div></figcaption>
</figure> <!-- 要 MathJax --></p>
<h3>ハッシュ・アルゴリズムとセキュリティ強度の関係</h3>
<p>次はハッシュ・アルゴリズムとセキュリティ強度の関係を示す表。</p>
<p><figure lang='en'>
<style>
main table.nist3 th {
vertical-align:middle;
text-align: center;
}
main table.nist3 td {
text-align: center;
}
</style>
<table class="nist3">
<thead>
<tr>
<th>Security <br>Strength</th>
<th>Digital Signatures and Other<br>Applications Requiring Collision<br>Resistance</th>
<th>HMAC, KMAC,<br>Key Derivation Functions,<br>Random Bit Generation</th>
</tr>
</thead>
<tbody>
<tr>
<td> $\le 8$0</td>
<td>SHA-1</td>
<td> </td>
</tr><tr>
<td>$112$</td>
<td>SHA-224, SHA-512/224, SHA3-224</td>
<td> </td>
</tr><tr>
<td>$128$</td>
<td>SHA-256, SHA-512/256, SHA3-256</td>
<td>SHA-1, KMAC128</td>
</tr><tr>
<td>$192$</td>
<td>SHA-384, SHA3-384</td>
<td>SHA-224, SHA-512/224, SHA3-224</td>
</tr><tr>
<td>$\ge 256$</td>
<td>SHA-512, SHA3-512</td>
<td>SHA-256, SHA-512/256, SHA-384, SHA-512, SHA3-256, SHA3-384, SHA3-512, KMAC256</td>
</tr>
</tbody>
</table>
<figcaption><div>Maximum security strengths for hash and hash-based functions (via <q><a href='https://doi.org/10.6028/NIST.SP.800-57pt1r5'>SP 800-57 Part 1 Revision 5 <sup><i class='far fa-file-pdf'></i></sup></a></q> 5.6.1.2)</div></figcaption>
</figure> <!-- 要 MathJax --></p>
<h3>セキュリティ強度と有効期限</h3>
<p>こちらはセキュリティ強度の有効期限を表したものだ。</p>
<p><figure lang='en'>
<style>
main table.nist4 th {
vertical-align:middle;
text-align: center;
}
main table.nist4 td {
vertical-align:middle;
text-align: center;
}
</style>
<table class="nist4">
<thead>
<tr>
<th colspan='2'>Security Strength</th>
<th>Through<br> 2030</th>
<th>2031 and<br> Beyond</th>
</tr>
</thead>
<tbody>
<tr><td rowspan='2'>$\lt 112$</td><td>Applying</td> <td colspan='2'>Disallowed</td></tr>
<tr> <td>Processing</td> <td colspan='2'>Legacy use</td></tr>
<tr><td rowspan='2'>$112$</td> <td>Applying</td> <td rowspan='2'>Acceptable</td><td>Disallowed</td></tr>
<tr> <td>Processing</td> <td>Legacy use</td></tr>
<tr><td>$128$</td> <td rowspan='3'>Applying/Processing</td><td>Acceptable</td><td>Acceptable</td></tr>
<tr><td>$192$</td> <td>Acceptable</td><td>Acceptable</td></tr>
<tr><td>$256$</td> <td>Acceptable</td><td>Acceptable</td></tr>
</tbody>
</table>
<figcaption><div>Security-strength time frames (via <q><a href='https://doi.org/10.6028/NIST.SP.800-57pt1r5'>SP 800-57 Part 1 Revision 5 <sup><i class='far fa-file-pdf'></i></sup></a></q> 5.6.3)</div></figcaption>
</figure> <!-- 要 MathJax --></p>
<p>各用語はそれぞれ</p>
<table>
<thead>
<tr>
<th style="text-align:left">用語</th>
<th style="text-align:left">意味</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Applying</td>
<td style="text-align:left">適用</td>
</tr>
<tr>
<td style="text-align:left">Processing</td>
<td style="text-align:left">処理</td>
</tr>
<tr>
<td style="text-align:left">Acceptable</td>
<td style="text-align:left">許容</td>
</tr>
<tr>
<td style="text-align:left">Legacy use</td>
<td style="text-align:left">許容(レガシー使用のみ)</td>
</tr>
<tr>
<td style="text-align:left">Disallowed</td>
<td style="text-align:left">禁止</td>
</tr>
</tbody>
</table>
<p>という意味だ。
例を挙げると,セキュリティ強度112ビットの暗号スイート(Cipher Suites)を適用する場合は2030年までは許容するけど2031年以降は禁止。
すでに暗号化されているデータを復号したい場合でも2031年以降はレガシー・システムしか許容しない,ということになる。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://qiita.com/aqmr-kino/items/8c3306ea8022b0d5cbe4">OpenSSHの暗号化周りの設定について - Qiita</a></li>
<li><a href="https://tex2e.github.io/blog/crypto/chacha20poly1305">ChaCha20-Poly1305の解説と実装 | 晴耕雨読</a></li>
<li><a href="https://support.conoha.jp/v/openssh/">OpenSSHの認証に証明書を使う方法|ConoHa VPSサポート</a></li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B079NL1L9K?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51mVqXeeVyL._SL160_.jpg" width="107" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B079NL1L9K?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">SSH Mastery: OpenSSH, PuTTY, Tunnels and Keys (IT Mastery Book 12) (English Edition)</a></dt>
<dd>Lucas, Michael W (著)</dd>
<dd>Tilted Windmill Press 2018-02-06 (Release 2018-02-06)</dd>
<dd>Kindle版</dd>
<dd>B079NL1L9K (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">タイトルを見て “SSH Mystery” と空目したアホは私です。洋書だけど英語不得手の私にも読める内容。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2021-01-11">2021-01-11</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- SSH Mastery -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51ZRZ62WKCL._SL160_.jpg" width="108" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号化 プライバシーを救った反乱者たち</a></dt>
<dd>スティーブン・レビー (著), 斉藤 隆央 (翻訳)</dd>
<dd>紀伊國屋書店 2002-02-16</dd>
<dd>単行本</dd>
<dd>4314009071 (ASIN), 9784314009072 (EAN), 4314009071 (ISBN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">20世紀末,暗号技術の世界で何があったのか。知りたかったらこちらを読むべし!</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-03-09">2015-03-09</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号化 プライバシーを救った反乱者たち -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
Git v2.29 がリリースされた
tag:text.Baldanders.info,2020-10-25:/release/2020/10/git-2_29-is-released/
2020-10-25T09:09:33+00:00
2020-11-02T23:24:36+00:00
SHA-2 コミット・ハッシュの実験的サポート / Windows 版 Git Credential Manager のアップグレード
Spiegel
https://baldanders.info/profile/
<p>先日 <a href="https://git-scm.com/">Git</a> v.2.29 がリリースされた。</p>
<ul>
<li><a href="https://lore.kernel.org/git/xmqqy2k2t77l.fsf@gitster.c.googlers.com/">[ANNOUNCE] Git v2.29.0</a></li>
</ul>
<h2>SHA-2 コミット・ハッシュの実験的サポート</h2>
<p>v2.29 ではコミット・ハッシュに関する重大な仕様変更がある。</p>
<figure lang="en">
<blockquote><q>Git 2.29 includes experimental support for writing your repository’s objects using a SHA-256 hash of their contents, instead of using SHA-1</q>.</blockquote>
<figcaption><div>via <q><a href="https://github.blog/2020-10-19-git-2-29-released/">Highlights from Git 2.29 - The GitHub Blog</a></q></div></figcaption>
</figure>
<p>といっても今回は実験的なサポート(experimental support)で,試すのであれば以下のような感じでできるらしい。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ git init --object-format=sha256 sample-repo
</span></span><span class="line"><span class="cl">Initialized empty Git repository in /home/username/sample-repo/.git/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ cd sample-repo
</span></span><span class="line"><span class="cl">$ echo 'Hello, SHA-256!' >README.md
</span></span><span class="line"><span class="cl">$ git add README.md
</span></span><span class="line"><span class="cl">$ git commit -m "README.md: initial commit"
</span></span><span class="line"><span class="cl">[main (root-commit) 6d45449] README.md: initial commit
</span></span><span class="line"><span class="cl"> 1 file changed, 1 insertion(+)
</span></span><span class="line"><span class="cl"> create mode 100644 README.md
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> $ git rev-parse HEAD
</span></span><span class="line"><span class="cl"> 6d45449028a8e76500adbfe7330e779d5dc4a3a14fca58ff08ec354c58727b2c
</span></span></code></pre></div><p>当然ながら SHA-1 ベースのコミット・ハッシュと SHA-2 (SHA256) ベースのコミット・ハッシュとの間には互換性がない。
当面は2系統のリポジトリを使い分けて運用することになりそうだ。
ただし,将来的には両者を相互運用できるようにするらしい。</p>
<figure lang="en">
<blockquote><q>In future releases, Git will support interoperating between repositories with different object formats by computing both a SHA-1 and SHA-256 hash of each object it writes, and storing a translation table between them. This will eventually allow repositories that store their objects using SHA-256 to interact with (sufficiently up-to-date) SHA-1 clients, and vice-versa. It will also allow converted SHA-256 repositories to have their references to older SHA-1 commits still function as normal (e.g., if I write a commit whose message references an earlier commit by its SHA-1 name, then Git will still be able to follow that reference even after the repository is converted to use SHA-256 by consulting the translation table)</q>.</blockquote>
<figcaption><div>via <q><a href="https://github.blog/2020-10-19-git-2-29-released/">Highlights from Git 2.29 - The GitHub Blog</a></q></div></figcaption>
</figure>
<p>ここまで到達すれば SHA-2 ベースへ本格的に切り替えていってもいいかも知れない。</p>
<h2>Windows 版 Git Credential Manager のアップグレード</h2>
<p><a href="https://gitforwindows.org/">Git for Windows</a> では,もうひとつ重大な変更がある。</p>
<figure lang="en">
<blockquote><q>This version upgrades existing users of <a href="https://github.com/microsoft/Git-Credential-Manager-for-Windows/">Git Credential Manager for Windows</a> (which was just deprecated) to <a href="https://github.com/microsoft/Git-Credential-Manager-Core">Git Credential Manager Core</a> (“GCM Core”, which is the designated successor of the former). This is necessary because <a href="https://github.blog/changelog/2019-08-08-password-based-http-basic-authentication-deprecation-and-removal/">GitHub deprecated password-based authentication</a> and intends to remove support for it soon, and GCM Core is prepared for this change.</q>.</blockquote>
<figcaption><div>via <q><a href="https://github.com/git-for-windows/git/releases/tag/v2.29.0.windows.1">Release Git for Windows 2.29.0 · git-for-windows/git</a></q></div></figcaption>
</figure>
<p>GitHub リポジトリに HTTPS でアクセスしている場合は注意が必要かも知れない(<a href="https://gitforwindows.org/">Git for Windows</a> を使ってないので,どの程度影響するか分かってない。ゴメンペコン <abbr class="emoji-chars" title="ゴメン">🙇</abbr>)。</p>
<h2>ブックマーク</h2>
<ul>
<li>
<p><a href="https://lore.kernel.org/git/xmqq4kmlj9q9.fsf@gitster.c.googlers.com/">[ANNOUNCE] Git v2.29.1</a></p>
</li>
<li>
<p><a href="https://lore.kernel.org/git/xmqqlffo4qjw.fsf@gitster.c.googlers.com/">[ANNOUNCE] Git v2.29.2 - Junio C Hamano</a></p>
</li>
<li>
<p><a href="https://github.blog/2020-10-19-git-2-29-released/">Highlights from Git 2.29 - The GitHub Blog</a></p>
</li>
<li>
<p><a href="https://github.com/git-for-windows/git/releases/tag/v2.29.0.windows.1">Release Git for Windows 2.29.0 · git-for-windows/git · GitHub</a></p>
</li>
<li>
<p><a href="https://github.com/git-for-windows/git/releases/tag/v2.29.1.windows.1">Release Git for Windows 2.29.1 · git-for-windows/git · GitHub</a></p>
</li>
<li>
<p><a href="https://github.com/git-for-windows/git/releases/tag/v2.29.2.windows.1">Release Git for Windows 2.29.2 · git-for-windows/git · GitHub</a></p>
</li>
<li>
<p><a href="https://forest.watch.impress.co.jp/docs/news/1284871.html">「Git for Windows 2.29.0」が公開 ~セットアップ時にデフォルトブランチ名を設定可能 - 窓の杜</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/remark/2019/04/install-git-from-ppa/">PPA から Git をインストールする</a></p>
</li>
<li>
<p><a href="https://zenn.dev/spiegel/articles/20201025-sayonara-sha1">さようなら SHA-1</a> : SHA-1 の危殆化について Zenn でまとめ記事を書いてみた</p>
</li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
OpenSSH 鍵をアップグレードする【2020-01-11 改訂】
tag:text.Baldanders.info,2020-06-01:/remark/2020/06/upgrade-openssh-key/
2020-06-01T07:12:32+00:00
2024-01-26T21:38:55+00:00
どうせ鍵を新調するのなら楕円曲線暗号で構成するのがいいよね。
Spiegel
https://baldanders.info/profile/
<p><strong>【2020-01-11 改訂】</strong></p>
<p>2020-05-27 に <a href="https://www.openssh.com/">OpenSSH</a> 8.3 がリリースされた。</p>
<ul>
<li><a href="https://lwn.net/Articles/821544/">OpenSSH 8.3 released (and ssh-rsa deprecation notice) [LWN.net]</a></li>
</ul>
<p>この中で “Future deprecation notice” として</p>
<figure lang="en">
<blockquote><q>It is now possible to perform chosen-prefix attacks against the SHA-1 algorithm for less than USD$50K. For this reason, we will be disabling the “ssh-rsa” public key signature algorithm by default in a near-future release</q>.</blockquote>
<figcaption><div>via <q><a href="https://lwn.net/Articles/821544/">OpenSSH 8.3 released (and ssh-rsa deprecation notice)</a></q></div></figcaption>
</figure>
<p>と書かれていてた<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。
といっても,これはサーバ側の設定の話だそうでクライアントには関係ないそうだ(<a href="https://github.com/spiegel-im-spiegel/github-pages-env/discussions/85">フィードバック</a>感謝)。</p>
<!--
クライアント側はそろそろ古い RSA 鍵から交換したほうがよさそうである。
もっとも最近のバージョン[^sha1b] で作った鍵であれば特に問題ないようだ。
[^sha1b]: ちなみに,私は2011年に作った RSA 鍵を使っているが,ハッシュ・アルゴリズムは SHA256 だった。少なくとも10年以内に作った鍵なら問題なさそう? あとは鍵長かねぇ。
```text
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/username/.ssh/id_rsa
Your public key has been saved in /home/username/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:qufsNjgco3QZNjE4eupwQiT6mD8fr2a7nXmU3ybxFHo username@hostname
The key's randomart image is:
+---[RSA 3072]----+
| . |
|..o o |
|+. . o |
|o.. + . |
|.* . + S. . . |
|* + = .o o E |
|o= +.+.. . * |
| .+ **+o. o + |
| =*XOo o |
+----[SHA256]-----+
```
ハッシュ・アルゴリズムが SHA256 以上になっているか,がポイント。
-->
<p>もし2048ビット以下の古い RSA 鍵を使ってるなら替えどきかな。
で,どうせ鍵を新調するのなら楕円曲線暗号(Elliptic Curve Cryptography; ECC)で構成するのがいいよね。</p>
<p>ちうわけで,ECC 鍵を作って登録するところまでやってみる。
ちゃんとメモっておかないと忘れるので(笑)</p>
<h2>前提条件【2021-01-09 変更】</h2>
<p>今回は <a href="https://www.ubuntu.com/" title="The leading operating system for PCs, IoT devices, servers and the cloud | Ubuntu">Ubuntu</a> 環境下での作業とし鍵管理を <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> で行うものとする。
<a href="https://www.ubuntu.com/" title="The leading operating system for PCs, IoT devices, servers and the cloud | Ubuntu">Ubuntu</a> での設定方法は以下を参考にどうぞ。</p>
<ul>
<li><a href="https://text.baldanders.info/openpgp/gpg-agent-in-ubuntu/">gpg-agent の設定: GnuPG in Ubuntu</a></li>
</ul>
<p>Windows 環境の場合は以下の拙文を参考にどうぞ。</p>
<ul>
<li><a href="https://text.baldanders.info/openpgp/using-gnupg-for-windows-2/">GnuPG for Windows : gpg-agent について</a></li>
</ul>
<p>ちなみに,今回は鍵の生成を <a href="https://www.openssh.com/">OpenSSH</a> で行っているが <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> でも生成できる。
詳しくは以下を参照のこと。</p>
<ul>
<li><a href="https://text.baldanders.info/openpgp/ssh-key-management-with-gnupg/">OpenSSH の認証鍵を GunPG で作成・管理する</a></li>
</ul>
<h2><a href="https://www.openssh.com/">OpenSSH</a> 鍵の生成</h2>
<p><a href="https://www.openssh.com/">OpenSSH</a> 鍵を生成するには <code>ssh-keygen</code> コマンドを使う。
たとえばこんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ ssh-keygen -t ecdsa -b 256 -C "alice@example.com"
</span></span><span class="line"><span class="cl">Generating public/private ecdsa key pair.
</span></span><span class="line"><span class="cl">Enter file in which to save the key (/home/username/.ssh/id_ecdsa):
</span></span><span class="line"><span class="cl">Enter passphrase (empty for no passphrase):
</span></span><span class="line"><span class="cl">Enter same passphrase again:
</span></span><span class="line"><span class="cl">Your identification has been saved in /home/username/.ssh/id_ecdsa
</span></span><span class="line"><span class="cl">Your public key has been saved in /home/username/.ssh/id_ecdsa.pub
</span></span><span class="line"><span class="cl">The key fingerprint is:
</span></span><span class="line"><span class="cl">SHA256:DtXgQm9rz7Dc5M5yWu/CNVo341o1rcfN9UCyYu+SZU4 alice@example.com
</span></span><span class="line"><span class="cl">The key's randomart image is:
</span></span><span class="line"><span class="cl">+---[ECDSA 256]---+
</span></span><span class="line"><span class="cl">| . . |
</span></span><span class="line"><span class="cl">| . o o |
</span></span><span class="line"><span class="cl">| . = . . . |
</span></span><span class="line"><span class="cl">| + . + .|
</span></span><span class="line"><span class="cl">| . S + . ..+|
</span></span><span class="line"><span class="cl">| = X oE +*=|
</span></span><span class="line"><span class="cl">| +.*X.+oo*|
</span></span><span class="line"><span class="cl">| .+Bo.... |
</span></span><span class="line"><span class="cl">| .+o+=. |
</span></span><span class="line"><span class="cl">+----[SHA256]-----+
</span></span></code></pre></div><p>これで作成された <code>id_ecdsa</code> および <code>id_ecdsa.pub</code> ファイルが鍵ファイルである。
ちなみに <code>id_ecdsa</code> ファイルには秘密鍵, <code>id_ecdsa.pub</code> ファイルには公開鍵が格納されている。</p>
<p><code>-t</code> オプションで鍵種別を, <code>-b</code> で鍵長(ビット数)をセットする。
鍵種別と鍵長の組み合わせと,それぞれに対するセキュリティ強度(ビット数)は以下の通り<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。</p>
<div>
<figure>
<style>
main table.sshkeys th {
vertical-align:middle;
text-align: center;
}
main table.sshkeys td {
vertical-align:middle;
//text-align: center;
}
</style>
<table class="sshkeys">
<thead>
<tr>
<th>鍵種別</th>
<th>鍵長</th>
<th>強度</th>
<th>楕円曲線名</th>
</tr>
</thead>
<tbody>
<tr>
<td><strike><code>dsa</code></strike></td>
<td class="right"><strike>1024</strike></td>
<td class="right">80</td>
<td>—</td>
</tr>
<tr>
<td rowspan="3"><code>ecdsa</code> / <code>ecdsa-sk</code></td>
<td class="right">256</td>
<td class="right">128</td>
<td><code>nistp256</code></td>
</tr>
<tr>
<td class="right">384</td>
<td class="right">192</td>
<td><code>nistp384</code></td>
</tr>
<tr>
<td class="right">521</td>
<td class="right">256</td>
<td><code>nistp521</code></td>
</tr>
<tr>
<td><code>ed25519</code> / <code>ed25519-sk</code></td>
<td class="right">—</td>
<td class="right">128</td>
<td><code>ed25519</code></td>
</tr>
<tr>
<td rowspan="3"><code>rsa</code></td>
<td class="right">3072</td>
<td class="right">128</td>
<td rowspan="3">—</td>
</tr>
<tr>
<td class="right">7680</td>
<td class="right">192</td>
</tr>
<tr>
<td class="right">15360</td>
<td class="right">256</td>
</tr>
</tbody>
</table>
</figure>
</div>
<p>この組み合わせの(<code>dsa</code> 以外の)いずれかであれば2031年以降も問題なく使える。
なお <code>ecdsa-sk</code> および <code>ed25519-sk</code> は暗号デバイスに登録する際に使うらしい(今回は割愛する)。</p>
<p>余談だが楕円曲線 <code>ed25519</code> に対応する電子署名アルゴリズムは EdDSA と呼ばれ <a href="https://tools.ietf.org/html/rfc8032" title="RFC 8032 - Edwards-Curve Digital Signature Algorithm (EdDSA)">RFC 8032</a> で規定されている<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>。
なんで鍵種別を <code>eddsa</code> としなかったのかは知らない。
紛らわしかったのかな?</p>
<h3>楕円曲線と鍵長</h3>
<p>(「<a href="https://text.baldanders.info/openpgp/using-ecc-with-gnupg/">そろそろ GnuPG でも ECC を標準で使うのがいいんじゃないかな</a>」より抜粋)</p>
<p>ここでちょっと横道に逸れて鍵長の話をしておく。</p>
<p>たとえば RSA の(平文 $M$ から暗号文 $C$ への)暗号化は以下の式で表される。</p>
<figure><div class="mathjax box">
\[
C = M^e \bmod n
\]
</div></figure>
<p>$(e, n)$ のセットが公開鍵で, $n$ のサイズが鍵長に相当する。
実際の計算はともかく,感覚としては分かりやすいよね。</p>
<p>ECC の場合は暗号化の前に,まずベースとなる楕円曲線の(素数 $q$ で決められる)素体(prime fields)を決めなければならない<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>。
これは以下の式で表される。</p>
<figure><div class="mathjax box">
\[
E : y^2 \equiv x^3 + ax + b \pmod{q}
\]
</div></figure>
<p>この素体上の有理点の数(位数)を $\#E$ とした時の $\#E$ のサイズが鍵長に相当する。
$(a,b,q)$ といったパラメータを眺めただけでは鍵長が分からないというのが面倒臭い感じである<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>。</p>
<p>そこで ECC の場合は楕円曲線を表すパラメータのセットが標準化されている。
<a href="https://www.openssh.com/">OpenSSH</a> の場合は <code>nistp256</code>, <code>nistp384</code>, <code>nistp521</code>, <code>ed25519</code> といった楕円曲線名に対応している。
つまり楕円曲線名から楕円曲線の種類を特定し,そこから鍵長も分かる,というわけだ。</p>
<h2><a href="https://www.openssh.com/">OpenSSH</a> 鍵の登録(クライアント側)</h2>
<p>本題に戻る。
作成した <a href="https://www.openssh.com/">OpenSSH</a> 鍵ファイル <code>id_ecdsa</code> および <code>id_ecdsa.pub</code> を登録しよう。</p>
<p>クライアント側は <code>ssh-add</code> コマンドを使って秘密鍵ファイル <code>id_ecdsa</code> の内容を <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> の鍵束に永続的に登録できる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ ssh-add ./id_ecdsa
</span></span><span class="line"><span class="cl">Enter passphrase for ./id_ecdsa:
</span></span><span class="line"><span class="cl">Identity added: ./id_ecdsa (alice@example.com)
</span></span></code></pre></div><p>この時 <code>ssh-add</code> コマンドによるパスフレーズ入力とは別に <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> の pinentry によるパスフレーズの設定が行われる(確認を含めて2回入力する必要あり)。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./pinentry.png"><img src="./pinentry.png" srcset="./pinentry.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="pinentry" loading="lazy"></a><figcaption><div><a href="./pinentry.png">pinentry</a></div></figcaption>
</figure>
<p>Pinentry で設定するパスフレーズは <code>id_ecdsa</code> ファイルに対するものとは管理が異なるので注意。
というか <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> の鍵束に登録したら <code>id_ecdsa</code> ファイルは不要になる。</p>
<p><a href="https://www.openssh.com/">OpenSSH</a> 秘密鍵が登録できたかどうかは <code>~/.gnupg/sshcontrol</code> ファイルで確認できる。
ちゃんと登録できていれば以下のような内容が追記される。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"># ECDSA key added on: 2020-06-01 14:05:35
</span></span><span class="line"><span class="cl"># Fingerprints: MD5:e4:5b:66:a6:03:9a:a4:0e:f2:1b:a5:04:72:93:f3:f0
</span></span><span class="line"><span class="cl"># SHA256:DtXgQm9rz7Dc5M5yWu/CNVo341o1rcfN9UCyYu+SZU4
</span></span><span class="line"><span class="cl">A5353D587000D820669B0BD55A0B4AD6897458DB 0
</span></span></code></pre></div><p>また <code>ssh-add -L</code> コマンドでも登録した鍵を確認できる。</p>
<p>鍵の実体は <code>~/.gnupg/private-keys-v1.d/</code> ディレクトリにある。
上述の鍵の場合は</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">A5353D587000D820669B0BD55A0B4AD6897458DB.key
</span></span></code></pre></div><p>というファイル名で格納されているはずである。</p>
<h2><a href="https://www.openssh.com/">OpenSSH</a> 鍵の登録(サーバ側)</h2>
<p>ログイン先のサーバに公開鍵ファイル <code>id_ecdsa.pub</code> の中身を登録する。
つっても,どうにかして <code>id_ecdsa.pub</code> ファイルをサーバにアップロードして</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ cat ./id_ecdsa.pub >> ~/.ssh/authorized_keys
</span></span></code></pre></div><p>と <code>authorized_keys</code> ファイルに追記すればよい。
追記ではなく内容を書き換えるなら</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ cat ./id_ecdsa.pub > ~/.ssh/authorized_keys
</span></span></code></pre></div><p>でもよい。
書き換えるなら以前のファイルのバックアップはとってね。
パーミッションの設定も忘れずに。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ chmod 700 ~/.ssh
</span></span><span class="line"><span class="cl">$ chmod 600 ~/.ssh/authorized_keys
</span></span></code></pre></div><p>老婆心ながら,新しい鍵でログインできることを確認するまでは接続中のセッションは切らないこと。
設定を間違えてログイン不能になったら悲惨だからねぇ。</p>
<div class="box"><h3>【2021-12-13 追記】 ssh-copy-id を使う方法</h3>
<p><a href="https://github.com/spiegel-im-spiegel/github-pages-env/discussions/85#discussioncomment-1793423">フィードバックで教えてもらった</a>が(感謝!) <code>ssh-copy-id</code> コマンド(中身は shell スクリプト)を使うともっと簡単に登録できるそうだ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ ssh-copy-id -h
</span></span><span class="line"><span class="cl">Usage: /usr/bin/ssh-copy-id [-h|-?|-f|-n] [-i [identity_file]] [-p port] [-F alternative ssh_config file] [[-o <ssh -o options>] ...] [user@]hostname
</span></span><span class="line"><span class="cl"> -f: force mode -- copy keys without trying to check if they are already installed
</span></span><span class="line"><span class="cl"> -n: dry run -- no keys are actually copied
</span></span><span class="line"><span class="cl"> -h|-?: print this help
</span></span></code></pre></div><p>ふむむ。
<code>-n</code> オプションで dry run できるのか。
ありがたい。</p>
<p><code>-i</code> オプションで公開鍵ファイルを指定するが,標準入力からも受け付けるようなので,パイプで繋いで</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ ssh-add -L | ssh-copy-id -n alice@hostname
</span></span><span class="line"><span class="cl">/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
</span></span><span class="line"><span class="cl">/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
</span></span><span class="line"><span class="cl">=-=-=-=-=-=-=-=
</span></span><span class="line"><span class="cl">Would have added the following key(s):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFfjejx/Saej929myfZoBQAKgusPi2iiOxdZZfpCLxh5 (none)
</span></span><span class="line"><span class="cl">=-=-=-=-=-=-=-=
</span></span></code></pre></div><p>てな感じにできる(実際に登録する際は <code>-n</code> オプションを外してね)。</p>
<p>あるいは <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> で作った認証鍵であれば</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gpg --export-ssh-key alice | ssh-copy-id -n alice@hostname
</span></span></code></pre></div><p>などとすることもできる(実際に登録する際は <code>-n</code> オプションを外してね)。</p>
<p>サーバ側に既に <code>~/.ssh/authorized_keys</code> ファイルがある場合は(公開鍵認証でログインした上で)ちゃんと追記してくれるし,パーミッションの心配も要らないようだ。</p>
<p>教えていただいて本当にありがとう <abbr class="emoji-chars" title="ペコン">🙇</abbr></p>
</div>
<h3>各種 <a href="https://git-scm.com/">Git</a> リポジトリ・サービスに公開鍵を登録する</h3>
<p><a href="https://github.com/">GitHub</a> ではリポジトリのアクセスに <a href="https://www.openssh.com/">OpenSSH</a> 認証が使える。
<a href="https://www.openssh.com/">OpenSSH</a> 認証に使う公開鍵は設定の “<a href="https://github.com/settings/keys">SSH and GPG keys</a>” で登録する(複数登録可能)。</p>
<p><a href="https://bitbucket.org/product/">Bitbucket</a> や <a href="https://gitlab.com/">GitLab</a> などの各種 <a href="https://git-scm.com/">git</a> リポジトリ・サービスでも同様に <a href="https://www.openssh.com/">OpenSSH</a> 公開鍵を登録できる。</p>
<p>よしゃあ! これで作業完了。</p>
<h2>ブックマーク</h2>
<ul>
<li>
<p><a href="https://orumin.blogspot.com/2020/05/ssh-rsa.html">ssh-rsa,非推奨のお知らせ</a></p>
</li>
<li>
<p><a href="https://japan.zdnet.com/article/35154545/">OpenSSH、将来のリリースでssh-rsa公開鍵の署名アルゴリズムをデフォルトで無効に - ZDNet Japan</a></p>
</li>
<li>
<p><a href="https://support.conoha.jp/v/openssh/">OpenSSHの認証に証明書を使う方法|ConoHa VPSサポート</a></p>
</li>
<li>
<p><a href="https://qiita.com/aat00000/items/a7973b104be9bfd3bb5c">SSHのCA認証 - Qiita</a></p>
</li>
<li>
<p><a href="https://gist.github.com/artizirk/d09ce3570021b0f65469cb450bee5e29">OpenPGP SSH access with Yubikey and GnuPG · GitHub</a></p>
</li>
<li>
<p><a href="https://developers.yubico.com/PIV/Guides/Securing_SSH_with_OpenPGP_or_PIV.html">Securing SSH with OpenPGP or PIV</a></p>
</li>
<li>
<p><a href="https://developers.yubico.com/SSH/">Securing SSH with the YubiKey</a></p>
</li>
<li>
<p><a href="https://dev.classmethod.jp/articles/ssh-ubuntu-ec2-with-fido-u2f-security-key/">セキュリティキー「YubiKey」でEC2へのSSHを2段階認証にしてみた | Developers.IO</a></p>
</li>
<li>
<p><a href="https://nulab.com/ja/blog/backlog/disables-rsa-sig-using-the-sha-1-in-openssh/">OpenSSHがSHA-1を使用したRSA署名を廃止、BacklogのGitで発生した問題と解決にいたるまでの道のり | 株式会社ヌーラボ(Nulab inc.)</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/remark/2017/10/key-parameters/">暗号鍵関連の各種変数について</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/remark/2020/01/sayonara-sha-1/">(何度目かの)さようなら SHA-1</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/remark/2020/06/eddsa/">Edwards-curve Digital Signature Algorithm</a></p>
</li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51ZRZ62WKCL._SL160_.jpg" width="108" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号化 プライバシーを救った反乱者たち</a></dt>
<dd>スティーブン・レビー (著), 斉藤 隆央 (翻訳)</dd>
<dd>紀伊國屋書店 2002-02-16</dd>
<dd>単行本</dd>
<dd>4314009071 (ASIN), 9784314009072 (EAN), 4314009071 (ISBN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">20世紀末,暗号技術の世界で何があったのか。知りたかったらこちらを読むべし!</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-03-09">2015-03-09</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号化 プライバシーを救った反乱者たち -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>実は同様の問題は <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> でも指摘されていて,半年前にリリースされた 2.2.18 で対応済みである(<a href="https://text.baldanders.info/release/2019/11/gnupg-2_2_18-is-released/">GnuPG 2.2.18 リリース: さようなら SHA-1</a>) <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p><a href="https://github.com/spiegel-im-spiegel/github-pages-env/discussions/85">フィードバック</a>で教えていただいたが, <a href="https://www.openssh.com/">OpenSSH</a> は FIPS 186-3 以降の DSA に対応していないそうで,1024ビットの鍵長しか選択できないらしい。なので,最近の <a href="https://www.openssh.com/">OpenSSH</a> のデフォルト設定では DSA を無効にしているそうな。情報感謝です。あと <code>ecdsa-sk</code> では鍵長の指定はできない(無視される)ようだ。256ビット(<code>nistp256</code>)固定ってことかな? <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3">
<p><code>ed25519</code> (edwards25519) は <a href="http://cr.yp.to/ecdh.html" title="Curve25519: high-speed elliptic-curve cryptography">Curve25519</a> と双有理同値な楕円曲線で,鍵長も <a href="http://cr.yp.to/ecdh.html" title="Curve25519: high-speed elliptic-curve cryptography">Curve25519</a> と同じく256ビット(セキュリティ強度128ビット)と見積もられている。ちなみに <a href="http://cr.yp.to/ecdh.html" title="Curve25519: high-speed elliptic-curve cryptography">Curve25519</a> は ECDH 用の楕円曲線およびそのライブラリで,公有(public domain)のソフトウェアとして公開されている。また <a href="https://text.baldanders.info/remark/2020/06/eddsa/" title="Edwards-curve Digital Signature Algorithm">EdDSA は FIPS 186-5 に組み込まれる予定</a>になっていて,そうなれば正式に NIST 標準となる。 <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4">
<p>素体ではなく「標数2の体(binary fields)」を使う場合もあるが,ここでは割愛する。 <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:5">
<p>楕円曲線と楕円曲線暗号については結城浩さんの『<a href="https://www.amazon.co.jp/exec/obidos/ASIN/B015643CPE/baldandersinf-22/">暗号技術入門 第3版</a>』の付録に比較的分かりやすい解説が載っている。同じく結城浩さんの『<a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00L0PDMK4/baldandersinf-22/">数学ガール ガロア理論</a>』が何となく分かれば楕円曲線についても何となく分かると思う。大丈夫。私も何となくしか分かっていない(笑) <a href="#fnref:5" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
(何度目かの)さようなら SHA-1
tag:text.Baldanders.info,2020-01-09:/remark/2020/01/sayonara-sha-1/
2020-01-09T14:02:25+00:00
2020-10-26T10:24:45+00:00
思ったより騒がれてる感じなので記事を立ててみた。
Spiegel
https://baldanders.info/profile/
<p>2019年11月に書いた「<a href="https://text.baldanders.info/release/2019/11/gnupg-2_2_18-is-released/">GnuPG 2.2.18 リリース: さようなら SHA-1</a>」に追記してお終いにしようかと思ったが,思ったより騒がれてる感じなので記事を立ててみた。</p>
<p>というわけで:</p>
<ul>
<li><a href="https://eprint.iacr.org/2020/014">Cryptology ePrint Archive: Report 2020/014 - SHA-1 is a Shambles - First Chosen-Prefix Collision on SHA-1 and Application to the PGP Web of Trust</a></li>
<li><a href="https://sha-mbles.github.io/">SHA-1 is a Shambles</a></li>
<li><a href="https://arstechnica.com/information-technology/2020/01/pgp-keys-software-security-and-much-more-threatened-by-new-sha1-exploit/">PGP keys, software security, and much more threatened by new SHA1 exploit | Ars Technica</a></li>
<li><a href="https://www.schneier.com/blog/archives/2020/01/new_sha-1_attac.html">New SHA-1 Attack - Schneier on Security</a></li>
</ul>
<p>要約としては <a href="https://www.schneier.com/blog/archives/2020/01/new_sha-1_attac.html" title="New SHA-1 Attack - Schneier on Security">Bruce Schneier さんの記事</a>が分かりやすいので,これを起点に紹介していく。</p>
<h2>ハッシュ値の衝突問題</h2>
<p>(「<a href="https://text.baldanders.info/remark/2015/problem-of-sha1-collision/">SHA-1 衝突問題: 廃止の前倒し</a>」からの抜粋)</p>
<p>暗号技術におけるハッシュ関数とは,以下の機能を持ったアルゴリズムである</p>
<ol>
<li>任意のデータ列を一定の長さのデータ列(ハッシュ値)に「要約」する</li>
<li>ハッシュ値から元のデータ列を推測できない</li>
<li>ひとつのハッシュ値に対して複数のデータ列が(実時間で)見つからない</li>
</ol>
<p>ハッシュ関数はメッセージ認証符号(Message Authentication Code; MAC)や電子署名(digital signature)の中核技術のひとつであり,データの「完全性(Integrity)」を担保する重要な要素である。
特に3番目の「ひとつのハッシュ値に対して複数のデータ列が(実時間で)見つからない」という機能が破られると,そのハッシュ関数では完全性を担保できなくなってしまう。
これを「ハッシュ値の衝突問題」という。</p>
<h2>SHA-1 ハッシュ値を力づくで攻略してみる</h2>
<p>SHA-1 における「ハッシュ値の衝突問題」は<a href="https://baldanders.info/blog/000048/">2004年まで遡る</a>が,当時の攻略法は SHA-1 アルゴリズムの危殆化を狙ったもので,しかもその後の進展は殆どなかった。</p>
<p>この状況が変わったのが2015年の “<a href="https://sites.google.com/site/itstheshappening/">freestart collisions for SHA-1</a>” 論文である。</p>
<ul>
<li><a href="https://text.baldanders.info/remark/2015/problem-of-sha1-collision/">SHA-1 衝突問題: 廃止の前倒し</a></li>
</ul>
<p>ここで初めて「SHA-1 ハッシュ値を力づくで攻略」できる可能性が示された。
さらに2017年には Google によって最初の SHA-1 衝突例が公表された。</p>
<ul>
<li><a href="https://text.baldanders.info/remark/2017/02/sha-1-collision/">最初の SHA-1 衝突例</a></li>
</ul>
<p>今回の “<a href="https://sha-mbles.github.io/">SHA-1 is a Shambles</a>” の注目点は</p>
<ol>
<li>“chosen-prefix collision for SHA-1” なる手法により,衝突可能なデータを用意する際の自由度が高い</li>
<li>ハッシュ値を攻略する際の計算機パワーの調達コストが比較的実用的なレベルまで下がった</li>
</ol>
<p>の2つである。
特に2番目が重要で, “Nvidia GTX 1060GPU” × 900 の構成で2ヶ月ほどで攻略できたらしい。
コストにして 45k USD だそうだ<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<h2><a href="https://www.openpgp.org/">OpenPGP</a> / <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> は既に SHA-1 を捨てつつある</h2>
<p>“<a href="https://sha-mbles.github.io/">SHA-1 is a Shambles</a>” では <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> が生成する公開鍵への電子署名をターゲットにしているが,実は現行の <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> 2.2 系は既に SHA-1 を捨てつつあり,電子署名に使うハッシュ関数の既定は SHA256 である(“<a href="https://sha-mbles.github.io/">SHA-1 is a Shambles</a>” で指摘されているのはレガシー・バージョンの 1.4 系のほう)。</p>
<p>たとえば私が git コミットへの署名などで<a href="https://baldanders.info/pubkeys/">普段遣いしている OpenPGP 鍵</a>は2013年に作ったものだが,鍵への署名は SHA256 で行っている。
私の公開鍵をチェックするには以下のコマンドを実行すればよい(何気に拙作の <a href="https://github.com/spiegel-im-spiegel/gpgpdump" title="spiegel-im-spiegel/gpgpdump: OpenPGP packet visualizer">gpgpdump</a> を宣伝しておく<code>w</code>)。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ wget https://baldanders.info/pubkeys/spiegel.asc -O - | gpgpdump
</span></span></code></pre></div><p>また,次期 OpenPGP 標準となる <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-rfc4880bis/" title="draft-ietf-openpgp-rfc4880bis - OpenPGP Message Format">RFC 4880bis</a> では新しい V5 パケットを策定中だが,鍵指紋(key fingerprint)に使うハッシュ関数の既定が SHA256 になるようだ。
<a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-rfc4880bis/" title="draft-ietf-openpgp-rfc4880bis - OpenPGP Message Format">RFC 4880bis</a> が正式に RFC 標準として公開されれば,かつての MD5 と同じく, SHA-1 は後方互換性のためだけに残されることになるだろう<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。</p>
<p><a href="https://www.openpgp.org/">OpenPGP</a> の実装は <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> だけではなく,今や<a href="https://www.symantec.com/products/encryption">シマンテック社のおまけプロダクトに成り下がった PGP</a> をはじめ <a href="http://openpgpjs.org/" title="OpenPGP.js | OpenPGP JavaScript Implementation">JsvaScript</a> や <a href="https://sequoia-pgp.org/" title="Sequoia-PGP">Rust</a> などによる実装がある。
これらの実装が SHA-1 をどのように取り扱っているかは分からない。
どなたか教えて!</p>
<div class="box"><p><strong>【2020-10-26 追記】</strong>
<a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> 以外の実装でも議論が行われているようだ。</p>
<ul>
<li><a href="https://mailarchive.ietf.org/arch/msg/openpgp/Rp-inhYKT8A9H5E34iLTrc9I0gc/">[openpgp] Deprecating SHA1</a></li>
</ul></div>
<h2><a href="https://git-scm.com/">Git</a> のコミット・ハッシュはどうなるのか</h2>
<p>おそらく今回の件でもっとも議論を呼ぶのは <a href="https://git-scm.com/">git</a> なんじゃないだろうか。
<a href="https://git-scm.com/">Git</a> のコミット・ハッシュは SHA-1 を使って行われるが,ハッシュ値の衝突が比較的簡単にできるようになれば,ひとつのコミット・ハッシュに対して複数のコミットが重複してしまうという問題が現実的になるかもしれない(ならないかもしれない)。</p>
<p>ただ,コミットへの電子署名が正しく運用されているなら,<a href="https://text.baldanders.info/openpgp/web-of-trust/" title="OpenPGP の電子署名は「ユーザーの身元を保証し」ない">なりすましに対してはある程度は抑止(防止ではない)できる</a>だろう。</p>
<p>なので,個人的にはあまり心配はしていない。
<a href="https://git-scm.com/">Git</a> の今後の活躍にご期待ください,といったところだろうか(笑)</p>
<div class="box"><p><strong>【2020-10-26 追記】</strong>
[Git] 2.29 から SHA-2 ベースのコミット・ハッシュがサポートされるようになった。</p>
<ul>
<li><a href="https://text.baldanders.info/release/2020/10/git-2_29-is-released/">Git v2.29 がリリースされた</a></li>
</ul></div>
<h2>ブックマーク</h2>
<ul>
<li>
<p><a href="https://mailarchive.ietf.org/arch/msg/openpgp/h-6vCMDFFKhVXpXLC6gAt9tK7r8">“SHA-1 is a Shambles” and forging PGP WoT signatures</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/openpgp/algorithms-for-openpgp/">OpenPGP で利用可能なアルゴリズム(RFC 4880bis 対応版)</a></p>
</li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51ZRZ62WKCL._SL160_.jpg" width="108" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号化 プライバシーを救った反乱者たち</a></dt>
<dd>スティーブン・レビー (著), 斉藤 隆央 (翻訳)</dd>
<dd>紀伊國屋書店 2002-02-16</dd>
<dd>単行本</dd>
<dd>4314009071 (ASIN), 9784314009072 (EAN), 4314009071 (ISBN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">20世紀末,暗号技術の世界で何があったのか。知りたかったらこちらを読むべし!</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-03-09">2015-03-09</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号化 プライバシーを救った反乱者たち -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>単純に 1 USD = 110 JPY とするなら 45k USD = 4.95M JPY ほど。まぁ五百万円以下で攻略できてしまうわけですな。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p><a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-rfc4880bis/" title="draft-ietf-openpgp-rfc4880bis - OpenPGP Message Format">RFC 4880bis</a> では SHA-1 は “SHOULD NOT create messages” となる。<a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> 2.2.18 以降では,これが前倒しで実装されたわけだ。ちなみに <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> 2.2 系では MD5 は既にサポートされていない(1.4 系があるため)。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
GnuPG 2.2.18 リリース: さようなら SHA-1
tag:text.Baldanders.info,2019-11-26:/release/2019/11/gnupg-2_2_18-is-released/
2019-11-26T13:12:19+00:00
2020-09-18T01:51:57+00:00
2019-01-19 以降に鍵に付与された SHA-1 ベースの電子署名を全て削除する(CVE-2019-14855)。
Spiegel
https://baldanders.info/profile/
<p><a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> 2.2.18 がリリースされた。</p>
<ul>
<li><a href="https://lists.gnupg.org/pipermail/gnupg-announce/2019q4/000442.html">[Announce] GnuPG 2.2.18 released</a></li>
</ul>
<p>今回は(<a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> 自体には)脆弱性もなく通常のメンテナンス・リリースなのだが,ひとつ大きな修正というか対策があって</p>
<figure lang="en">
<blockquote><q>This release also retires the use of SHA-1 key signatures created since this year.</q></blockquote>
<figcaption><div>via <q><a href="https://lists.gnupg.org/pipermail/gnupg-announce/2019q4/000442.html">GnuPG 2.2.18 released</a></q></div></figcaption>
</figure>
<p>らしい。
厳密には 2019-01-19 以降に鍵に付与された SHA-1 ベースの電子署名を全て削除するというもの(<a href="https://nvd.nist.gov/vuln/detail/CVE-2019-14855">CVE-2019-14855</a>)。</p>
<div class="box"><p><strong>【2020-09-18 追記】</strong>
<a href="https://nvd.nist.gov/vuln/detail/CVE-2019-14855">CVE-2019-14855</a> の CVSS 評価は以下の通り。</p>
<ul>
<li><code>CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N</code></li>
<li>深刻度: 重要 (7.5)</li>
</ul>
<table>
<thead>
<tr>
<th>基本評価基準</th>
<th>評価値</th>
</tr>
</thead>
<tbody>
<tr>
<td>攻撃元区分</td>
<td>ネットワーク</td>
</tr>
<tr>
<td>攻撃条件の複雑さ</td>
<td>低</td>
</tr>
<tr>
<td>必要な特権レベル</td>
<td>不要</td>
</tr>
<tr>
<td>ユーザ関与レベル</td>
<td>不要</td>
</tr>
<tr>
<td>スコープ</td>
<td>変更なし</td>
</tr>
<tr>
<td>機密性への影響</td>
<td>高</td>
</tr>
<tr>
<td>完全性への影響</td>
<td>なし</td>
</tr>
<tr>
<td>可用性への影響</td>
<td>なし</td>
</tr>
</tbody>
</table>
<p>ただし Red Hat はもう少し低めに見積もっているようで</p>
<ul>
<li><code>CVSS:3.0/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N</code></li>
<li>深刻度: 警告 (5.3)</li>
</ul>
<table>
<thead>
<tr>
<th>基本評価基準</th>
<th>評価値</th>
</tr>
</thead>
<tbody>
<tr>
<td>攻撃元区分</td>
<td>ネットワーク</td>
</tr>
<tr>
<td>攻撃条件の複雑さ</td>
<td>高</td>
</tr>
<tr>
<td>必要な特権レベル</td>
<td>不要</td>
</tr>
<tr>
<td>ユーザ関与レベル</td>
<td>要</td>
</tr>
<tr>
<td>スコープ</td>
<td>変更なし</td>
</tr>
<tr>
<td>機密性への影響</td>
<td>高</td>
</tr>
<tr>
<td>完全性への影響</td>
<td>なし</td>
</tr>
<tr>
<td>可用性への影響</td>
<td>なし</td>
</tr>
</tbody>
</table>
<p>としている。</p>
</div>
<p>とはいえ,ずいぶん前から <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> が生成する電子署名は SHA2-256 ベースが既定なので影響は限定的だと思うが<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, <strong>わざわざ</strong> SHA-1 ベースの電子署名を鍵に付与している方はご注意を。</p>
<p>一応 <code>--allow-weak-key-signatues</code> オプションを付けることで今回の措置を回避できるようだが,腹を括ったほうがいいだろう。
なお,鍵への電子署名にどのようなアルゴリズムが使われているかを調べるために拙作の <a href="https://github.com/spiegel-im-spiegel/gpgpdump" title="spiegel-im-spiegel/gpgpdump: OpenPGP packet visualizer">gpgpdump</a> を宣伝しておく(笑)</p>
<ul>
<li><a href="https://text.baldanders.info/release/gpgpdump/">OpenPGP パケットを可視化する gpgpdump</a></li>
</ul>
<p>例えば,こんな感じで鍵を取り出して調べることができる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gpg -a --export alice@example.com | gpgpdump
</span></span></code></pre></div><p>その他,詳細はこちら。</p>
<figure lang="en">
<blockquote><ul>
<li>gpg: Changed the way keys are detected on a smartcards; this allows the use of non-OpenPGP cards. In the case of a not very likely regression the new option <code>--use-only-openpgp-card</code> is available. [#4681]</li>
<li>gpg: The commands <code>--full-gen-key</code> and <code>--quick-gen-key</code> now allow direct key generation from supported cards. [#4681]</li>
<li>gpg: Prepare against chosen-prefix SHA-1 collisions in key signatures. This change removes all SHA-1 based key signature newer than 2019-01-19 from the web-of-trust. Note that this includes all key signature created with dsa1024 keys. The new option <code>--allow-weak-key-signatues</code> can be used to override the new and safer behaviour. [#4755,CVE-2019-14855]</li>
<li>gpg: Improve performance for import of large keyblocks. [#4592]</li>
<li>gpg: Implement a keybox compression run. [#4644]</li>
<li>gpg: Show warnings from dirmngr about redirect and certificate problems (details require <code>--verbose</code> as usual).</li>
<li>gpg: Allow to pass the empty string for the passphrase if the ‘<code>--passphase=</code>’ syntax is used. [#4633]</li>
<li>gpg: Fix printing of the KDF object attributes.</li>
<li>gpg: Avoid surprises with <code>--locate-external-key</code> and certain <code>--auto-key-locate</code> settings. [#4662]</li>
<li>gpg: Improve selection of best matching key. [#4713]</li>
<li>gpg: Delete key binding signature when deletring a subkey. [#4665,#4457]</li>
<li>gpg: Fix a potential loss of key sigantures during import with <code>self-sigs-only</code> active. [#4628]</li>
<li>gpg: Silence “marked as ultimately trusted” diagnostics if option <code>--quiet</code> is used. [#4634]</li>
<li>gpg: Silence some diagnostics during in key listsing even with option <code>--verbose</code>. [#4627]</li>
<li>gpg, gpgsm: Change parsing of agent’s pkdecrypt results. [#4652]</li>
<li>gpgsm: Support AES-256 keys.</li>
<li>gpgsm: Fix a bug in triggering a keybox compression run if <code>--faked-system-time</code> is used.</li>
<li>dirmngr: System CA certificates are no longer used for the SKS pool if GNUTLS instead of NTBTLS is used as TLS library. [#4594]</li>
<li>dirmngr: On Windows detect usability of IPv4 and IPv6 interfaces to avoid long timeouts. [#4165]</li>
<li>scd: Fix BWI value for APDU level transfers to make Gemalto Ezio Shield and Trustica Cryptoucan work. [#4654,#4566]</li>
<li>wkd: gpg-wks-client <code>--install-key</code> now installs the required policy file.</li>
</ul>
<p>Release-info: <a href="https://dev.gnupg.org/T4684">https://dev.gnupg.org/T4684</a></p></blockquote>
<figcaption><div>via <q><a href="https://lists.gnupg.org/pipermail/gnupg-announce/2019q4/000442.html">GnuPG 2.2.18 released</a></q></div></figcaption>
</figure>
<p>アップデートは計画的に。</p>
<h2>【2020-09-18 追記】 <a href="https://www.ubuntu.com/" title="The leading operating system for PCs, IoT devices, servers and the cloud | Ubuntu">Ubuntu</a> 18.04 LTS にてバックポート・パッチのリリースあり</h2>
<p>LTS 版 <a href="https://www.ubuntu.com/" title="The leading operating system for PCs, IoT devices, servers and the cloud | Ubuntu">Ubuntu</a> 18.04 にて <a href="https://nvd.nist.gov/vuln/detail/CVE-2019-14855">CVE-2019-14855</a> に対応したバックポートパッチが出ている。</p>
<ul>
<li><a href="https://ubuntu.com/security/notices/USN-4516-1">USN-4516-1: GnuPG vulnerability | Ubuntu security notices | Ubuntu</a></li>
</ul>
<p>今更どういうつもりなのか。
いや,まぁ,出るだけマシだけど。</p>
<p>ちなみに現時点で LTS 最新版である 20.04 では 2.2.19 が提供されている。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">gpg --version
</span></span><span class="line"><span class="cl">gpg (GnuPG) 2.2.19
</span></span><span class="line"><span class="cl">libgcrypt 1.8.5
</span></span><span class="line"><span class="cl">Copyright (C) 2019 Free Software Foundation, Inc.
</span></span><span class="line"><span class="cl">License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
</span></span><span class="line"><span class="cl">This is free software: you are free to change and redistribute it.
</span></span><span class="line"><span class="cl">There is NO WARRANTY, to the extent permitted by law.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Home: /home/username/.gnupg
</span></span><span class="line"><span class="cl">サポートしているアルゴリズム:
</span></span><span class="line"><span class="cl">公開鍵: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
</span></span><span class="line"><span class="cl">暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
</span></span><span class="line"><span class="cl"> TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
</span></span><span class="line"><span class="cl">ハッシュ: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
</span></span><span class="line"><span class="cl">圧縮: 無圧縮, ZIP, ZLIB, BZIP2
</span></span></code></pre></div><p>現時点の <a href="https://gnupg.org/" title="The GNU Privacy Guard">GnuPG</a> 最新は 2.2.23 だけどね(笑)</p>
<p>しかし <a href="https://www.ubuntu.com/" title="The leading operating system for PCs, IoT devices, servers and the cloud | Ubuntu">Ubuntu</a> の足の遅さは何とかならないのかねぇ。
APT でも使う中核部品だろうに。</p>
<h2>ブックマーク</h2>
<ul>
<li>
<p><a href="https://mailarchive.ietf.org/arch/msg/openpgp/h-6vCMDFFKhVXpXLC6gAt9tK7r8">“SHA-1 is a Shambles” and forging PGP WoT signatures</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/openpgp/algorithms-for-openpgp/">OpenPGP で利用可能なアルゴリズム(RFC 4880bis 対応版)</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/remark/2015/problem-of-sha1-collision/">SHA-1 衝突問題: 廃止の前倒し</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/remark/2017/02/sha-1-collision/">最初の SHA-1 衝突例</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/remark/2020/01/sayonara-sha-1/">(何度目かの)さようなら SHA-1</a></p>
</li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51ZRZ62WKCL._SL160_.jpg" width="108" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号化 プライバシーを救った反乱者たち</a></dt>
<dd>スティーブン・レビー (著), 斉藤 隆央 (翻訳)</dd>
<dd>紀伊國屋書店 2002-02-16</dd>
<dd>単行本</dd>
<dd>4314009071 (ASIN), 9784314009072 (EAN), 4314009071 (ISBN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">20世紀末,暗号技術の世界で何があったのか。知りたかったらこちらを読むべし!</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-03-09">2015-03-09</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号化 プライバシーを救った反乱者たち -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>ちなみに私が<a href="https://baldanders.info/pubkeys/" title="OpenPGP 公開鍵リスト">普段遣いしている鍵</a>は2013年に作ったものだが, SHA2-256 ベースの電子署名が付与されている。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
Hash 値を計算するパッケージを作ってみた
tag:text.Baldanders.info,2017-10-31:/golang/calculating-hash-value/
2017-10-31T05:31:04+00:00
2021-11-28T02:58:44+00:00
Windows で hash 値を計算するいい感じのツールがないので,もう自分で作っちゃったよ。といっても自前の部分は殆どないけどね。
Spiegel
https://baldanders.info/profile/
<p>Windows で hash 値を計算するいい感じのツールがない<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> ので,もう自分で作っちゃったよ。
といっても自前の部分は殆どないけどね。</p>
<ul>
<li><a href="https://github.com/spiegel-im-spiegel/hash">spiegel-im-spiegel/hash: Calculating Hash Value</a></li>
</ul>
<p>詳しくは <a href="https://github.com/spiegel-im-spiegel/hash/blob/master/README.md" title="hash/README.md at master · spiegel-im-spiegel/hash">README.md</a> を見ていただくとして,実際に計算をするのはこの関数。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">hash</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s">"crypto"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"io"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"strings"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="s">"github.com/pkg/errors"</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="c1">//ErrNoImplement is error "no implementation"
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">ErrNoImplement</span> <span class="p">=</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">"no implementation"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//Value returns hash value string from io.Reader
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">Value</span><span class="p">(</span><span class="nx">r</span> <span class="nx">io</span><span class="p">.</span><span class="nx">Reader</span><span class="p">,</span> <span class="nx">alg</span> <span class="nx">crypto</span><span class="p">.</span><span class="nx">Hash</span><span class="p">)</span> <span class="p">([]</span><span class="kt">byte</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">!</span><span class="nx">alg</span><span class="p">.</span><span class="nf">Available</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">Wrap</span><span class="p">(</span><span class="nx">ErrNoImplement</span><span class="p">,</span> <span class="s">"error "</span><span class="o">+</span><span class="nf">algoString</span><span class="p">(</span><span class="nx">alg</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">h</span> <span class="o">:=</span> <span class="nx">alg</span><span class="p">.</span><span class="nf">New</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">io</span><span class="p">.</span><span class="nf">Copy</span><span class="p">(</span><span class="nx">h</span><span class="p">,</span> <span class="nx">r</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">h</span><span class="p">.</span><span class="nf">Sum</span><span class="p">(</span><span class="kc">nil</span><span class="p">),</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>呼び出し側はこんな感じ(空文字列の SHA1 値を取得する場合)。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">v</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">hash</span><span class="p">.</span><span class="nf">Value</span><span class="p">(</span><span class="nx">bytes</span><span class="p">.</span><span class="nf">NewBuffer</span><span class="p">([]</span><span class="nb">byte</span><span class="p">(</span><span class="s">""</span><span class="p">)),</span> <span class="nx">crypto</span><span class="p">.</span><span class="nx">SHA1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">"%x\n"</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Output:
</span></span></span><span class="line"><span class="cl"><span class="c1">// da39a3ee5e6b4b0d3255bfef95601890afd80709
</span></span></span></code></pre></div><p><a href="https://golang.org/pkg/crypto/" title="crypto - The Go Programming Language"><code>crypto</code></a><code>.Hash.New()</code> 関数で <a href="https://golang.org/pkg/hash/" title="hash - The Go Programming Language"><code>hash</code></a><code>.Hash</code> のインスタンスを生成している。
<a href="https://golang.org/pkg/hash/" title="hash - The Go Programming Language"><code>hash</code></a><code>.Hash</code> はこんな感じの <a href="https://go.dev/ref/spec#Interface_types" title="Interface types">interface</a> 型である。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Hash is the common interface implemented by all hash functions.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">type</span> <span class="nx">Hash</span> <span class="kd">interface</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// Write (via the embedded io.Writer interface) adds more data to the running hash.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// It never returns an error.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">io</span><span class="p">.</span><span class="nx">Writer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// Sum appends the current hash to b and returns the resulting slice.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// It does not change the underlying hash state.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nf">Sum</span><span class="p">(</span><span class="nx">b</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// Reset resets the Hash to its initial state.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nf">Reset</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// Size returns the number of bytes Sum will return.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nf">Size</span><span class="p">()</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// BlockSize returns the hash's underlying block size.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// The Write method must be able to accept any amount
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// of data, but it may operate more efficiently if all writes
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// are a multiple of the block size.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nf">BlockSize</span><span class="p">()</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>つまり,このインタフェースを備えていれば自前の hash アルゴリズムを簡単に組み込むことができるわけだ。
言い方を変えると, <code>hash.Value()</code> 関数で実際に hash 値を計算するにはこのパッケージだけではダメで, hash アルゴリズムを実装するパッケージをインポートする必要がある。</p>
<p>以下にアルゴリズム毎に必要なパッケージを示す。</p>
<table>
<thead>
<tr>
<th style="text-align:left">hash algorithm</th>
<th style="text-align:left">import package</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>crypto.MD4</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/md4</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.MD5</code></td>
<td style="text-align:left"><code>crypto/md5</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA1</code></td>
<td style="text-align:left"><code>crypto/sha1</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA224</code></td>
<td style="text-align:left"><code>crypto/sha256</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA256</code></td>
<td style="text-align:left"><code>crypto/sha256</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA384</code></td>
<td style="text-align:left"><code>crypto/sha512</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA512</code></td>
<td style="text-align:left"><code>crypto/sha512</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA512_224</code></td>
<td style="text-align:left"><code>crypto/sha512</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA512_256</code></td>
<td style="text-align:left"><code>crypto/sha512</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.RIPEMD160</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/ripemd160</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA3_224</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/sha3</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA3_256</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/sha3</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA3_384</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/sha3</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.SHA3_512</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/sha3</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.BLAKE2s_256</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/blake2s</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.BLAKE2b_256</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/blake2b</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.BLAKE2b_384</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/blake2b</code></td>
</tr>
<tr>
<td style="text-align:left"><code>crypto.BLAKE2b_512</code></td>
<td style="text-align:left"><code>golang.org/x/crypto/blake2b</code></td>
</tr>
</tbody>
</table>
<p>この中から必要なパッケージを <code>main</code> パッケージでブランク・インポートする<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。
全部インポートするならこんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"crypto/md5"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"crypto/sha1"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"crypto/sha256"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"crypto/sha512"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"golang.org/x/crypto/blake2b"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"golang.org/x/crypto/blake2s"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"golang.org/x/crypto/md4"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"golang.org/x/crypto/ripemd160"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"golang.org/x/crypto/sha3"</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>これを CLI (Command-Line Interface) にしたのが以下に示す hash コマンドである。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ hash -h
</span></span><span class="line"><span class="cl">Usage:
</span></span><span class="line"><span class="cl"> hash [flags] [binary file]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Flags:
</span></span><span class="line"><span class="cl"> -a, --algo string hash algorithm (default "sha256")
</span></span><span class="line"><span class="cl"> -c, --compare string compare hash value
</span></span><span class="line"><span class="cl"> -h, --help help for hash
</span></span></code></pre></div><p>サイズがゼロの空ファイル <code>empty.txt</code> を作って試してみると</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ hash -a sha1 empty.txt
</span></span><span class="line"><span class="cl">da39a3ee5e6b4b0d3255bfef95601890afd80709
</span></span></code></pre></div><p>となる。
パイプにも対応してるので</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ cat empty.txt | hash -a sha1
</span></span><span class="line"><span class="cl">da39a3ee5e6b4b0d3255bfef95601890afd80709
</span></span></code></pre></div><p>とすることもできる。
さらに <code>-c</code> オプションで hash 値の計算結果をリファレンスの値と比較できる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ hash -a sha1 empty.txt -c da39a3ee5e6b4b0d3255bfef95601890afd80709
</span></span><span class="line"><span class="cl">matched
</span></span></code></pre></div><p>なお,アルゴリズムには <code>md4</code>, <code>md5</code>, <code>sha1</code>, <code>sha224</code>, <code>sha256</code>, <code>sha384</code>, <code>sha512</code>, <code>sha512/224</code>, <code>sha512/256</code>, <code>ripemd160</code>, <code>sha3-224</code>, <code>sha3-256</code>, <code>sha3-384</code>, <code>sha3-512</code>, <code>blake2s</code>, <code>blake2b/256</code>, <code>blake2b/384</code>, <code>blake2b/512</code> を指定できるようにした。
既定は <code>sha256</code>。</p>
<p>例えば,これで <a href="https://github.com/golang/dep" title="golang/dep: Go dependency management tool">dep</a> の実行モジュールの正当性確認が少し楽になる。
<a href="https://github.com/golang/dep" title="golang/dep: Go dependency management tool">dep</a> の<a href="https://github.com/golang/dep/releases/latest">リリースページ</a>で Windows 用の実行モジュールと SHA256 値を記述したファイルをダウンロードする。</p>
<ul>
<li><code>dep-windows-amd64</code></li>
<li><code>dep-windows-amd64.sha256</code></li>
</ul>
<p><code>dep-windows-amd64.sha256</code> の中身が</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">034f8cf6c225fde51aa025376df12450832f111b39050a7ec451a9ec2ce2cb54 release/dep-windows-amd64
</span></span></code></pre></div><p>とするなら</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ hash dep-windows-amd64 -c 034f8cf6c225fde51aa025376df12450832f111b39050a7ec451a9ec2ce2cb54
</span></span><span class="line"><span class="cl">matched
</span></span></code></pre></div><p>で一発確認できる。
確認できたら <code>dep-windows-amd64</code> を <code>dep.exe</code> にリネームして使えばよい。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://text.baldanders.info/golang/consider-switching-from-glide-to-dep/">Glide から Dep への移行を検討する</a></li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/416Stewy0NS._SL160_.jpg" width="123" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラミング言語Go</a></dt>
<dd>アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)</dd>
<dd>丸善出版 2016-06-20 (Release 2021-07-13)</dd>
<dd>Kindle版</dd>
<dd>B099928SJD (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想は<a href="https://text.baldanders.info/remark/2016/07/go-programming-language/" >こちら</a>。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2021-05-22">2021-05-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- プログラミング言語Go -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Windows 標準ツールとしては, PowerShell 4.0 以上が入っている PC なら, <code>Get-FileHash</code> コマンドレットが使える。 Windows 7 の場合は “<a href="https://www.microsoft.com/ja-jp/download/details.aspx?id=40855">Windows Management Framework 4.0</a>” をインストールすることで PowerShell 4.0 にアップグレードできる。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p>ブランク・インポートは <code>main</code> パッケージでしないと <a href="https://github.com/golang/lint" title="golang/lint: This is a linter for Go source code.">golint</a> に怒られるのよ。まぁ言いたいことは分かるけど。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
暗号鍵関連の各種変数について
tag:text.Baldanders.info,2017-10-17:/remark/2017/10/key-parameters/
2017-10-17T07:32:03+00:00
2020-06-07T02:09:49+00:00
この記事は将来の記事で再利用するための snippet 置き場として使うことにする。
Spiegel
https://baldanders.info/profile/
<p>「<a href="https://qiita.com/darai0512/items/c7b47d1b3fe06c4dea7d">ECDSA鍵をGitHubで使う方法</a>」で SP 800-57 第一部が Rev.4 になってるのを見て一瞬「ふぁ!」となったが,よく考えたら今年始めに書いた「<a href="https://text.baldanders.info/remark/2017/02/sha-1-collision/">最初の SHA-1 衝突例</a>」では既に Rev.4 を参照していたのだった。
でも古い記事を見返したら結構 Rev.3 のままになってるので,このさい全部アップデートすることにした。</p>
<p>この記事は将来の記事で再利用するための snippet 置き場として使うことにする。
表のレイアウトの関係で携帯端末で見ている人は見づらいかもしれないけど,そこはご容赦。</p>
<div class="box"><strong>【2020-06-07】</strong> SP 800-57 第一部 の Rev.5 の最終版がリリースされていたので,以降 Rev.5 をベースに書き換えた。</div>
<h2>参照資料</h2>
<p>ここで参照する資料は,米国 <a href="https://www.nist.gov/" title="National Institute of Standards and Technology | NIST">NIST</a> の Special Publication (SP) 800-57 Part 1 で正式タイトルは「Recommendation for Key Management Part 1: General (鍵管理における推奨事項 第一部:一般事項)」となっている(日本語訳は IPA によるもの)。</p>
<ul>
<li><a href="https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final">SP 800-57 Part 1 Rev. 5, Recommendation for Key Management: Part 1 – General | CSRC</a>
<ul>
<li><span><a href="https://doi.org/10.6028/NIST.SP.800-57pt1r5">NIST Special Publication 800-57 Part 1; Revision 5; Recommendation for Key Management Part 1: General <sup><i class="far fa-file-pdf"></i></sup></a></span></li>
</ul>
</li>
</ul>
<p>なお,ひとつ前の <a href="https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-4/final" title="SP 800-57 Part 1 Rev. 4 Recommendation for Key Management, Part 1: General">Rev.4</a> については <span><a href="https://www.ipa.go.jp/files/000055490.pdf">IPA による日本語訳 <sup><i class="far fa-file-pdf"></i></sup></a></span> があるので参考にどうぞ。</p>
<h2>セキュリティ強度と鍵長の関係</h2>
<p>最初はセキュリティ強度と鍵長の関係を示す表。
単位は全てビットである。</p>
<p><figure lang="en">
<style>
main table.nist2 th {
vertical-align:middle;
text-align: center;
}
main table.nist2 td {
vertical-align:middle;
text-align: center;
}
</style>
<table class="nist2">
<thead>
<tr>
<th>Security<br>Strength</th>
<th>Symmetric<br> key<br> algorithms</th>
<th>FFC<br>(DSA, DH,<br>MQV)</th>
<th>IFC<br>(RSA)</th>
<th>ECC<br>(ECDSA,<br>EdDSA, DH,<br>MQV)</th>
</tr>
</thead>
<tbody>
<tr><td> $\le 80$ </td><td>2TDEA</td><td> $L=1024$ <br> $N=160$ </td><td> $k=1024$ </td> <td> $f = 160\text{ - }223$ </td></tr>
<tr><td> $112$ </td><td>3TDEA</td><td> $L=2048$ <br> $N=224$ </td><td>$k=2048$</td> <td>$f = 224\text{ - }255$</td></tr>
<tr><td> $128$ </td><td>AES-128</td><td> $L=3072$ <br> $N=256$ </td><td>$k=3072$</td> <td>$f = 256\text{ - }383$</td></tr>
<tr><td> $192$ </td><td>AES-192</td><td> $L=7680$ <br> $N=384$ </td><td>$k=7680$</td> <td>$f = 384\text{ - }511$</td></tr>
<tr><td> $256$ </td><td>AES-256</td><td> $L=15360$ <br> $N=512$ </td><td>$k=15360$</td><td>$f=512+$</td></tr>
</tbody>
</table>
<figcaption><div>Comparable security strengths of symmetric block cipher and asymmetric-key algorithms (via <q><a href='https://doi.org/10.6028/NIST.SP.800-57pt1r5'>SP 800-57 Part 1 Revision 5 <sup><i class='far fa-file-pdf'></i></sup></a></q> 5.6.1.1)</div></figcaption>
</figure> <!-- 要 MathJax --></p>
<p>Symmetric key algorithms は共通鍵暗号アルゴリズム全般を指す。
たとえば AES とか。
IFC (Integer Factorization Cryptosystems) は素因数分解問題ベースの公開鍵暗号アルゴリズムで RSA がこれに該当する。
FFC (Finite Field Cryptosystems) は離散対数問題ベースの公開鍵暗号アルゴリズムで Diffie-Hellman や ElGamal, DSA などがこれに該当する。
ECC (Elliptic Curve Cryptosystems) は離散対数問題でも特に楕円曲線上の離散対数問題ベースの公開鍵暗号アルゴリズムを指す。
たとえば ECDH や ECDSA など。</p>
<p>IFC では $k$,FFC では $L$,ECC では $f$ が鍵長を示す。
たとえばセキュリティ強度が128ビットなら</p>
<ul>
<li>AES 128bit</li>
<li>ElGamal, DSA 3072bit</li>
<li>RSA 3072bit</li>
<li>ECDH, ECDSA 256bit</li>
</ul>
<p>の組み合わせで「<a href="https://dic.pixiv.net/a/%E3%83%93%E3%83%AB%E3%83%89%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC">ベストマッチ</a> キター!」となる。</p>
<h2>セキュリティ強度と Hash 関数の関係</h2>
<p>次はセキュリティ強度とHash 関数の関係を示す表。</p>
<p><figure lang='en'>
<style>
main table.nist3 th {
vertical-align:middle;
text-align: center;
}
main table.nist3 td {
text-align: center;
}
</style>
<table class="nist3">
<thead>
<tr>
<th>Security <br>Strength</th>
<th>Digital Signatures and Other<br>Applications Requiring Collision<br>Resistance</th>
<th>HMAC, KMAC,<br>Key Derivation Functions,<br>Random Bit Generation</th>
</tr>
</thead>
<tbody>
<tr>
<td> $\le 8$0</td>
<td>SHA-1</td>
<td> </td>
</tr><tr>
<td>$112$</td>
<td>SHA-224, SHA-512/224, SHA3-224</td>
<td> </td>
</tr><tr>
<td>$128$</td>
<td>SHA-256, SHA-512/256, SHA3-256</td>
<td>SHA-1, KMAC128</td>
</tr><tr>
<td>$192$</td>
<td>SHA-384, SHA3-384</td>
<td>SHA-224, SHA-512/224, SHA3-224</td>
</tr><tr>
<td>$\ge 256$</td>
<td>SHA-512, SHA3-512</td>
<td>SHA-256, SHA-512/256, SHA-384, SHA-512, SHA3-256, SHA3-384, SHA3-512, KMAC256</td>
</tr>
</tbody>
</table>
<figcaption><div>Maximum security strengths for hash and hash-based functions (via <q><a href='https://doi.org/10.6028/NIST.SP.800-57pt1r5'>SP 800-57 Part 1 Revision 5 <sup><i class='far fa-file-pdf'></i></sup></a></q> 5.6.1.2)</div></figcaption>
</figure> <!-- 要 MathJax --></p>
<p>考え方は先程の暗号鍵長のときと同じ。
ただし Hash 関数の場合は使用目的ごとに要求されるアルゴリズムが異なるので注意が必要である。</p>
<h2>セキュリティ強度と有効期限</h2>
<p>こちらはセキュリティ強度の有効期限を表したものだ。</p>
<p><figure lang='en'>
<style>
main table.nist4 th {
vertical-align:middle;
text-align: center;
}
main table.nist4 td {
vertical-align:middle;
text-align: center;
}
</style>
<table class="nist4">
<thead>
<tr>
<th colspan='2'>Security Strength</th>
<th>Through<br> 2030</th>
<th>2031 and<br> Beyond</th>
</tr>
</thead>
<tbody>
<tr><td rowspan='2'>$\lt 112$</td><td>Applying</td> <td colspan='2'>Disallowed</td></tr>
<tr> <td>Processing</td> <td colspan='2'>Legacy use</td></tr>
<tr><td rowspan='2'>$112$</td> <td>Applying</td> <td rowspan='2'>Acceptable</td><td>Disallowed</td></tr>
<tr> <td>Processing</td> <td>Legacy use</td></tr>
<tr><td>$128$</td> <td rowspan='3'>Applying/Processing</td><td>Acceptable</td><td>Acceptable</td></tr>
<tr><td>$192$</td> <td>Acceptable</td><td>Acceptable</td></tr>
<tr><td>$256$</td> <td>Acceptable</td><td>Acceptable</td></tr>
</tbody>
</table>
<figcaption><div>Security-strength time frames (via <q><a href='https://doi.org/10.6028/NIST.SP.800-57pt1r5'>SP 800-57 Part 1 Revision 5 <sup><i class='far fa-file-pdf'></i></sup></a></q> 5.6.3)</div></figcaption>
</figure> <!-- 要 MathJax --></p>
<p>各用語はそれぞれ</p>
<table>
<thead>
<tr>
<th style="text-align:left">用語</th>
<th style="text-align:left">意味</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Applying</td>
<td style="text-align:left">適用</td>
</tr>
<tr>
<td style="text-align:left">Processing</td>
<td style="text-align:left">処理</td>
</tr>
<tr>
<td style="text-align:left">Acceptable</td>
<td style="text-align:left">許容</td>
</tr>
<tr>
<td style="text-align:left">Legacy use</td>
<td style="text-align:left">許容(レガシー使用のみ)</td>
</tr>
<tr>
<td style="text-align:left">Disallowed</td>
<td style="text-align:left">禁止</td>
</tr>
</tbody>
</table>
<p>という意味だ。
例を挙げると,セキュリティ強度112ビットの暗号スイート(Cipher Suites)を適用する場合は2030年までは許容するけど2031年以降は禁止。
すでに暗号化されているデータを復号したい場合でも2031年以降はレガシー・システムしか許容しない,ということになる。</p>
<p>たとえば ssh 認証は「適用」なので,いまだ多くの人が使ってる(かもしれない) RSA 2048ビットの鍵は2031年以降は使用禁止となるわけだ。
まぁ,そんな先まで同じシステムで同じ鍵を使い続けるかどうかは分からないが(なので今使ってる鍵を慌てて新調する必要はない。新規に作成するなら128ビット強度の鍵をお勧めするが)。</p>
<p>なお,これは各アルゴリズムに危殆化要因となる脆弱性等がない場合の話である。
したがって暗号製品を使うシステムの管理者やセキュリティ管理者は常に暗号関係のトピックに耳を澄ませておくべきであろう。</p>
<h2>OpenPGP で利用可能なアルゴリズム</h2>
<p>この項は「<a href="https://text.baldanders.info/openpgp/algorithms-for-openpgp/">OpenPGP で利用可能なアルゴリズム</a>」に移動した。</p>
<h2>パスワードの強度</h2>
<p>これは <a href="https://www.nist.gov/" title="National Institute of Standards and Technology | NIST">NIST</a> ではなく IPA の資料だが,文字種と文字数の組み合わせによるパスワードの強度についても上げておこう。
出典は以下。</p>
<ul>
<li><a href="https://www.ipa.go.jp/security/ipg/documents/dev_setting_crypt.html">情報漏えいを防ぐためのモバイルデバイス等設定マニュアル:IPA 独立行政法人 情報処理推進機構</a>
<ul>
<li><span><a href="https://www.ipa.go.jp/files/000026760.pdf">情報漏えいを防ぐためのモバイルデバイス等設定マニュアル 解説編 <sup><i class="far fa-file-pdf"></i></sup></a></span></li>
</ul>
</li>
</ul>
<p><figure>
<table>
<thead>
<tr>
<th colspan='4'>利用する文字種類数と内訳</th>
<th colspan='4'>パスワード長</th>
</tr>
<tr>
<th>種類数</th>
<th>数字</th>
<th>文字</th>
<th>シンボル</th>
<th>4文字</th>
<th>8文字</th>
<th>12文字</th>
<th>16文字</th>
</tr>
</thead>
<tbody>
<tr><td>10種</td><td>0-9</td><td>なし</td><td>なし</td><td>1円未満<br>($2^{13.3}$)</td><td>1円未満<br>($2^{26.6}$)</td><td>約35円<br>($2^{39.9}$)</td><td>約35万円<br>($2^{53.2}$)</td></tr>
<tr><td>36種</td><td>0-9</td><td>a-z</td><td>なし</td><td>1円未満<br>($2^{20.7}$)</td><td>約100円<br>($2^{41.4}$)</td><td>約1.65億円<br>($2^{62.0}$)</td><td>約276兆円<br>($2^{82.7}$)</td></tr>
<tr><td>62種</td><td>0-9</td><td>a-z<br>A-Z</td><td>なし</td><td>1円未満<br>($2^{23.8}$)</td><td>約7,500円<br>($2^{47.6}$)</td><td>約1,120億円<br>($2^{71.5}$)</td><td>約165京円<br>($2^{95.3}$)</td></tr>
<tr><td>94種</td><td>0-9</td><td>a-z<br>A-Z</td>
<td><code style='font-size:smaller;'>! " # $ %<br>& ' ( ) =<br>~ | - ^ `<br>¥ { @ [<br>+ * ] ; :<br>} < > ? _<br>, . /</code></td>
<td>1円未満<br>($2^{26.2}$)</td><td>約21万円<br>($2^{52.4}$)</td><td>約16.5兆円<br>($2^{78.7}$)</td><br><td>約129,000京円<br>($2^{104.9}$)</td></tr>
</tbody>
</table>
<figcaption><div>パスワード解読の想定コスト例(<q><a href='https://www.ipa.go.jp/files/000026760.pdf'>情報漏えいを防ぐためのモバイルデバイス等設定マニュアル 解説編 <sup><i class='far fa-file-pdf'></i></sup></a></q> 2.4.2.2項より)</div></figcaption>
</figure> <!-- 要 MathJax --></p>
<p>測定基準は以下の通り。</p>
<div>
<figure>
<blockquote>
<q>利用できる文字種類すべてを完全にランダムに選択して作ったパスワードを一つ一つ調べる全数探索により1日で解読しようとした際にかかるおおまかな想定攻撃コストを示しています。ここでは、全数探索(暗号鍵の総数256)でDES10を1日で解読するためのコストを約250万円と仮定します。また、パスワードを1つ検査するのとDESの暗号鍵を1つ検査するコストは同じであるとし、パスワードを求めるのに必要な計算量(検査する個数)が半分になればコストも半分、2倍になればコストも2倍になるものとしています。</q>
</blockquote>
<figcaption><q><a href='https://www.ipa.go.jp/files/000026760.pdf'>情報漏えいを防ぐためのモバイルデバイス等設定マニュアル 解説編 <sup><i class='far fa-file-pdf'></i></sup></a></q> 2.4.2.2項より</figcaption>
</figure>
</div>
<h2>ブックマーク</h2>
<ul>
<li>
<p><a href="https://baldanders.info/blog/000740/">CRYPTREC Report 2013 — Baldanders.info</a></p>
</li>
<li>
<p><a href="https://baldanders.info/blog/000810/">Prohibiting RC4 — Baldanders.info</a></p>
</li>
<li>
<p><a href="http://www.cryptrec.go.jp/topics/cryptrec_20151218_sha1_cryptanalysis.html">CRYPTREC | SHA-1の安全性について</a></p>
<ul>
<li><span><a href="http://www.cryptrec.go.jp/report/c13_tech_guideline_SHA-1_web.pdf">CRYPTREC暗号技術ガイドライン(SHA-1) <sup><i class="far fa-file-pdf"></i></sup></a></span></li>
</ul>
</li>
<li>
<p><a href="https://blog.visvirial.com/articles/519">scryptがGPUに破られる時 | びりあるの研究ノート</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/remark/2017/02/sha-1-collision/">最初の SHA-1 衝突例</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/remark/2017/10/changes-in-password-best-practices/">「パスワードのベストプラクティス」が変わる</a></p>
</li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51ZRZ62WKCL._SL160_.jpg" width="108" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4314009071?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号化 プライバシーを救った反乱者たち</a></dt>
<dd>スティーブン・レビー (著), 斉藤 隆央 (翻訳)</dd>
<dd>紀伊國屋書店 2002-02-16</dd>
<dd>単行本</dd>
<dd>4314009071 (ASIN), 9784314009072 (EAN), 4314009071 (ISBN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">20世紀末,暗号技術の世界で何があったのか。知りたかったらこちらを読むべし!</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-03-09">2015-03-09</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号化 プライバシーを救った反乱者たち -->
最初の SHA-1 衝突例
tag:text.Baldanders.info,2017-02-25:/remark/2017/02/sha-1-collision/
2017-02-25T03:38:07+00:00
2020-06-07T02:09:49+00:00
もうみんな SHA-1 とはオサラバしてるよね(笑)
Spiegel
https://baldanders.info/profile/
<p>いやぁ,ついにこの日が来たようです。</p>
<ul>
<li><a href="https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html">Google Online Security Blog: Announcing the first SHA1 collision</a></li>
<li><a href="https://shattered.it/">SHAttered</a> : SHA-1 の衝突例</li>
<li><a href="https://www.schneier.com/blog/archives/2017/02/sha-1_collision.html">SHA-1 Collision Found - Schneier on Security</a></li>
<li><a href="http://www.itmedia.co.jp/enterprise/articles/1702/24/news067.html">SHA-1衝突攻撃がついに現実に、Google発表 90日後にコード公開 - ITmedia エンタープライズ</a></li>
<li><a href="https://blog.mozilla.org/security/2017/02/23/the-end-of-sha-1-on-the-public-web/">The end of SHA-1 on the Public Web | Mozilla Security Blog</a></li>
<li><a href="https://japan.zdnet.com/article/35097102/">グーグル、SHA-1衝突攻撃に成功–同一ハッシュ値の2つのPDFも公開 - ZDNet Japan</a></li>
<li><a href="https://mailarchive.ietf.org/arch/msg/openpgp/AjJ3BHzd2c9K2KQ3DTk9Ry_QVYM">Re: [openpgp] SHA1 collision found</a>
<ul>
<li><a href="https://mailarchive.ietf.org/arch/msg/openpgp/_uV_coJ0CYayv_2ptJMuSraJhws">[openpgp] V5 Fingerprint again</a></li>
</ul>
</li>
<li><a href="https://www.slideshare.net/herumi/googlesha1">GoogleのSHA-1のはなし</a> : 分かりやすい解説</li>
<li><a href="https://github.com/blog/2338-sha-1-collision-detection-on-github-com">SHA-1 collision detection on GitHub.com</a>
<ul>
<li><a href="http://internet.watch.impress.co.jp/docs/news/1050486.html">GitHub Enterprise、SHA-1衝突を実行不能にするパッチを適用へ -INTERNET Watch</a></li>
</ul>
</li>
</ul>
<figure lang="en">
<blockquote>
<q>This is not a surprise. We've all expected this for over a decade, watching computing power increase. This is why NIST standardized SHA-3 in 2012.</q>
</blockquote>
<figcaption><div>via <q><a href="https://www.schneier.com/blog/archives/2017/02/sha-1_collision.html">SHA-1 Collision Found</a></q></div></figcaption>
</figure>
<p>SHA-1 衝突問題については以下を参照のこと。
NIST などでは2014年以降 SHA-1 を電子署名等に使わないよう勧告している。</p>
<ul>
<li><a href="https://text.baldanders.info/remark/2015/problem-of-sha1-collision/">SHA-1 衝突問題: 廃止の前倒し</a></li>
<li><a href="http://www.cryptrec.go.jp/topics/cryptrec_20151218_sha1_cryptanalysis.html">CRYPTREC | SHA-1の安全性について</a></li>
</ul>
<p>現時点で主要な CA では証明書に SHA-1 は使っていないはずである。
また,主要なブラウザについても SHA-1 を使う証明書に対して警告を発するようになっている。</p>
<ul>
<li><a href="https://blogs.technet.microsoft.com/jpsecurity/2016/11/25/sha1countdown/">SHA-1 ウェブサーバー証明書は 2017 年2月から警告!ウェブサイト管理者は影響の最終確認を – 日本のセキュリティチーム</a></li>
<li><a href="http://forest.watch.impress.co.jp/docs/serial/yajiuma/1041798.html">「Google Chrome」の閲覧画面にエラーが! ~“https://”のサイトにアクセスできない - やじうまの杜 - 窓の杜</a></li>
</ul>
<p>もうみんな SHA-1 とはオサラバしてるよね(笑)</p>
<h2>追記というか補足</h2>
<p>たとえば git の commit hash 値は SHA-1 で付与されるが大丈夫なのか? とかいった意見が散見されるが,当面は問題ない。</p>
<p>今回の件はあくまでも電子署名や hash 値そのものを何かの証明に使おうとする場合に問題となる。
git の commit hash 値はあくまで identity として付与されるものである。
改ざんされたかどうかは commit hash 値ではなく差分情報によって容易に知ることができる。</p>
<p>git による悪意のなりすまし等を警戒する必要があるのなら commit hash 値を気にするのではなく commit にきちんと電子署名を行うことをお勧めする(チームで作業する人は是非習慣化するべきである)。</p>
<ul>
<li><a href="https://text.baldanders.info/remark/2016/04/git-commit-with-openpgp-signature/">Git Commit で OpenPGP 署名を行う</a></li>
</ul>
<p>ただし,かつて標準として使われていた MD5 が危殆化とともに廃れていったように,今後 SHA-1 は電子署名以外でも使われなくなると思われる。
念のため, NIST による現在の SHA アルゴリズムの評価と有効期限を以下に示す。</p>
<p><figure lang='en'>
<style>
main table.nist3 th {
vertical-align:middle;
text-align: center;
}
main table.nist3 td {
text-align: center;
}
</style>
<table class="nist3">
<thead>
<tr>
<th>Security <br>Strength</th>
<th>Digital Signatures and Other<br>Applications Requiring Collision<br>Resistance</th>
<th>HMAC, KMAC,<br>Key Derivation Functions,<br>Random Bit Generation</th>
</tr>
</thead>
<tbody>
<tr>
<td> $\le 8$0</td>
<td>SHA-1</td>
<td> </td>
</tr><tr>
<td>$112$</td>
<td>SHA-224, SHA-512/224, SHA3-224</td>
<td> </td>
</tr><tr>
<td>$128$</td>
<td>SHA-256, SHA-512/256, SHA3-256</td>
<td>SHA-1, KMAC128</td>
</tr><tr>
<td>$192$</td>
<td>SHA-384, SHA3-384</td>
<td>SHA-224, SHA-512/224, SHA3-224</td>
</tr><tr>
<td>$\ge 256$</td>
<td>SHA-512, SHA3-512</td>
<td>SHA-256, SHA-512/256, SHA-384, SHA-512, SHA3-256, SHA3-384, SHA3-512, KMAC256</td>
</tr>
</tbody>
</table>
<figcaption><div>Maximum security strengths for hash and hash-based functions (via <q><a href='https://doi.org/10.6028/NIST.SP.800-57pt1r5'>SP 800-57 Part 1 Revision 5 <sup><i class='far fa-file-pdf'></i></sup></a></q> 5.6.1.2)</div></figcaption>
</figure> <!-- 要 MathJax -->
<figure lang='en'>
<style>
main table.nist4 th {
vertical-align:middle;
text-align: center;
}
main table.nist4 td {
vertical-align:middle;
text-align: center;
}
</style>
<table class="nist4">
<thead>
<tr>
<th colspan='2'>Security Strength</th>
<th>Through<br> 2030</th>
<th>2031 and<br> Beyond</th>
</tr>
</thead>
<tbody>
<tr><td rowspan='2'>$\lt 112$</td><td>Applying</td> <td colspan='2'>Disallowed</td></tr>
<tr> <td>Processing</td> <td colspan='2'>Legacy use</td></tr>
<tr><td rowspan='2'>$112$</td> <td>Applying</td> <td rowspan='2'>Acceptable</td><td>Disallowed</td></tr>
<tr> <td>Processing</td> <td>Legacy use</td></tr>
<tr><td>$128$</td> <td rowspan='3'>Applying/Processing</td><td>Acceptable</td><td>Acceptable</td></tr>
<tr><td>$192$</td> <td>Acceptable</td><td>Acceptable</td></tr>
<tr><td>$256$</td> <td>Acceptable</td><td>Acceptable</td></tr>
</tbody>
</table>
<figcaption><div>Security-strength time frames (via <q><a href='https://doi.org/10.6028/NIST.SP.800-57pt1r5'>SP 800-57 Part 1 Revision 5 <sup><i class='far fa-file-pdf'></i></sup></a></q> 5.6.3)</div></figcaption>
</figure> <!-- 要 MathJax --></p>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51t6yHHVwEL._SL160_.jpg" width="113" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B015643CPE?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">暗号技術入門 第3版 秘密の国のアリス</a></dt>
<dd>結城 浩 (著)</dd>
<dd>SBクリエイティブ 2015-08-25 (Release 2015-09-17)</dd>
<dd>Kindle版</dd>
<dd>B015643CPE (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2015-09-20">2015-09-20</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- 暗号技術入門 第3版 -->