LoginSignup
260
274

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-25

本記事は拙ブログ記事「暗号化とハッシュ化に関する基本的な事柄まとめ - the world as code」のリファイン版です。

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

暗号

アルゴリズム

RSA

  • 公開鍵暗号。素因数分解の計算難度を根拠としたもの。なおRSAは発明者の名前から取られたものであり、何かの略ではない。
  • SSHログイン時の鍵認証やSSL認証など、広く使われる。
  • 秘密鍵生成コマンドとしてopenssl genrsaがある。SSH鍵認証ではssh-keygenを用いる。

DSA

  • Digital Signature Algorithm
  • 公開鍵暗号。根拠は離散対数問題の困難性。
  • SSH2が出た頃、特許が云々の関係でRSAの使用が推奨されなくなり、こっちが使われたりしたらしい。今は解消しているので、改めてRSAが推奨されている。
  • ssh-keygenの暗号化方式に指定することも可能だが、特に理由がなければ、あえてDSAを使う必要はなさそう。
  • 楕円曲線を用いたECDSAという変種がある。楕円曲線暗号はより短い鍵長で高い強度が保てるので、ポストRSAとして注目される。(@ITの技術解説を読んだがよくわからない)。ただしMacの標準SSH等、ECDSAに対応していない環境もまだ多いので注意が必要。

DES

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

AES

  • Advanced Encryption Standard
  • 共通鍵暗号。DESの安全性低下に伴い開発された、鍵長128bit超のブロック暗号。
  • zipやrarの暗号化等で用いられている。

xx bitってなに?

暗号化に用いる暗号鍵の桁数(鍵長)を示す。同じアルゴリズムを用いても鍵が異なれば暗号化結果は変化する。従って鍵を特定されなければ情報漏洩の問題はない。鍵長が長ければ長いほどパターンの数も増えるため、強度は増すことになる。

暗号強度の2010年問題

  • コンピューターの計算処理性能の向上に伴い、暗号強度は相対的に下がっていく。このため2010年をもって、アメリカ政府では1024bit以下のRSA、DSA暗号、160bit以下のECDSA、また2TDESとSHA-1の使用を廃止している。
  • 最新のssh-keygenデフォルトの鍵生成がRSAの2048bitになっているので、特に気にする必要はないが、念押しするのであればssh-keygen -t rsa -b 2048と指定できる。

ハッシュ

ソルト

ハッシュ化前に対象文字列に付加するランダムな文字列。同一文字列のハッシュ化時に衝突が防げる、レインボーテーブルによる探索に対する妨害になる、といった利点がある。openssl passwdコマンドでは、-salt stirngオプションを用いることで、stringをソルトとしたパスワードのハッシュ化ができる。

ストレッチング

ハッシュ化を何重にも実施することで、攻撃を受けた場合の解析に必要な時間を長期化して時間を稼ぐ策。当然ながらハッシュ化も長期化、高負荷化するのでほどほどに。

フィンガープリント

SSH初回ログインで表示されるやつ。接続先サーバーに保存されている公開鍵etc/ssh/ssh_host_rsa_key.pubのハッシュ値。クライアント側では、一度接続したサーバーのフィンガープリントが~/.ssh/known_hostsに記述され、次回以降のログインで照合が行われる。変更があると、同一ホスト名もしくはIPを用いたサーバーなりすましの危険性もあるため、警告が表示される。ssh-keygen -lfで先の公開鍵を確認することにより、フィンガープリントの表示が可能。

アルゴリズム

md5

  • Message Digest Algorythm 5
  • 出力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のシャドウパスワードを生成する - ひろうぃんの雑記

ハッシュ化コマンドは何を使う?

インフラエンジニアとして、ハッシュ化を用いる機会が最も多いのはChef等のプロビジョニングツールでユーザーのパスワードを指定する場合なのだが、これをシェルコマンドで実行しようとするとopenssl passwdによるmd5ハッシュ化ぐらいしか手段がない。上述の通りmd5の安全性は高くないため、個人的には使用が躊躇われるところではあるのだが、世のChefハウツー記事等を見ているとだいたいがmd5 + saltでのハッシュ化で済ませている。いいのかな?

有効と思われる代替手段の一つにgrub-cryptコマンドがあり、これはSHA-256とSHA-512に対応しているが、GRUB Legacyのツールであるため、最近のサーバーだと導入されていないことが多い。なおGRUB2ではgrub2-mkpasswd-pbkdf2コマンドが後継となっているようだが、これはPBKDF2という鍵導出関数?によるハッシュ化を行うとのことで、ちょっと理解が追い付いていない。

他の手段としてはRuby、Perl、Python等のLLを使うというものがある。ワンライナーで書けるので、grub-cryptの使えない環境ならこれが一番スマートかもしれない。

参考

260
274
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
260
274