chroju.dev/blog

the world as code

暗号化とハッシュ化に関する基本的な事柄まとめ

セキュリティスペシャリスト持ってるはずなのに曖昧な理解で誤魔化してたので自分用まとめ。また書き足すかも。なんか書き足し書き足ししていくようなノートの整理には、編集履歴が見られるQiitaの方が便利なのかなとか思うけど。

  • 暗号化とハッシュ化は違う。暗号化はデータの秘匿を目的としており、適切な鍵を用いることで復号が可能。ハッシュ化はデータの置換がそもそもの目的であり、ハッシュ関数により一定のフォーマットへ不可逆の変換を行う。
  • ただし、衝突耐性を持つことなどにより、セキュリティ用途に適する「暗号学的ハッシュ関数」というものもあるらしい。デジタル署名やメッセージ認証符号への使用を目的とされており、逆にチェックサム等に使用するには計算が「重い」。

暗号

主なアルゴリズムをざっと。

RSA

  • 公開鍵暗号。素因数分解の計算難度を根拠としたもの。サマウォで解いてたアレもたぶん素因数分解暗号だが、暗算で解かれたらたまったものではない。
  • SSHログイン時の鍵認証やSSL認証など、広く使われる。
  • 秘密鍵生成コマンドとしてopenssl genrsaがある。SSH鍵認証ではssh-keygenを用いる。

DES

  • 共通鍵暗号。鍵長54bitのブロック暗号。
  • 鍵長が短すぎるため、現在では安全ではないとされるが、暗号化復号化処理を3回実行するトリプルDESという形で主に実用されている。
  • openssl genrsaでの秘密鍵生成時に、パスフレーズによるトリプルDESでの暗号化を施すため、-des3オプションが用いられる。

AES

  • 共通鍵暗号。DESの安全性低下に伴い開発された、鍵長128bit超のブロック暗号。

ハッシュ

ソルト

ハッシュ化前に対象文字列に付加するランダムな文字列。同一文字列のハッシュ化時に衝突が防げる、レインボーテーブルによる探索に対する妨害になる、といった利点がある。

フィンガープリント

SSH初回ログインで表示されるやつ。公開鍵のハッシュ値。~/.ssh/known_hostsに記述され、次回以降のログインで公開鍵の変更有無の確認に使われる。変更があると、サーバーなりすましの危険性もあるため警告が表示される。ssh-keygen -lfでも表示可能。

md5

  • 出力128bitのハッシュアルゴリズム。ファイル配布時のチェックサムなどに用いられる。
  • 安全性は高くないことが判明しているため、日米ともにSHAの使用が推奨されている。
  • コマンドはmd5sumあるいはopenssl md5を使用する。
  • なおパスワードハッシュ化でよく用いられるopenssl passwdはmd5による実装。

sha

  • Secure Hash Algorithm。暗号学的ハッシュ関数の一つ。
  • SSL、SSH等で用いられる暗号化アルゴリズム。
  • SHA-0,1,2,3が存在しており、SHA-1には脆弱性が存在するため、SSL証明書はSHA-2への全面移行が進められている。すでにGoogle ChromeではSHA-1による証明書に対して警告が表示される。
  • SHA-2は鍵長によりSHA-224、SHA-256、SHA-384、SHA-512といったバリエーションが存在する。
  • 上述の通りopenssl passwdはSHA非対応だが、grub-cryptがSHA-2によるハッシュ化に使える模様。 参考: CentOS6.5でランダムSalt付きSHA-512のシャドウパスワードを生成する - ひろうぃんの雑記