しいしせねっとわーく
[しいしせねっと] [Linuxメモ] [PKI]
[OpenSSL]

cryptやDESやMD5でパスワードの暗号化?

暗号系をいろいろ整理していたのでまとめられるか?

電子署名、暗号などいろいろあるのはまとめて暗号分野に括ることができそうです。

ざっくりこんな感じでいろいろあります。ややJava寄りの内容かもしれません。

暗号の用途は基本的に元の要素がわからなくすることです。復元できるものを暗号、復元しないで指紋や印鑑的な使い方をするものをハッシュや電子署名(デジタル署名)といいます。

パスワードもハッシュなのですが、解読されないようより難しくしていたりします。

よく使われているアルゴリズムはRSAのあれとガロア体のいろいろ、XORしてみたり。というわけでRSAは比較的簡単

 

-------

以下旧

 

パスワードは、最近はMD5 (MessageDigest5)で暗号化されています。昔はDESだったりして8文字までのパスワードしか使えませんでした。

というわけで、セキュリティや[PKI]的な一環としてそういうところを詳しく掘り下げてみたいと思ってみたりします。

パスワードは、ハッシュ関数を何回も繰り返しかけて作られています。なので、DESやMD5を使っているといっても単純なハッシュではありません。

Unix系のパスワードは、cryptという関数により暗号化されています。これは、パスワードとちょっとした乱数(salt)から暗号化します。

パスワードで使われるものをMD5 Crypt、DES Cryptとでも呼びましょうか。

/etc/passwd や /etc/shadow に記録されているのは xxXXXXXXXXXXX 的なDES Crypt形式と、$1$xxxxxxxx$XXXXXXXXXXXXXXXXXXXXXX 的なMD5 Crypt形式があります。

頭の$1$で区別できるので併存することもできます。Apache httpdの htpasswd では MD5 Cryptを使ったパスワードは$apr1$ などではじまったりするのですが、アルゴリズム自体には互換性があります。ただ$apr1$の部分もハッシュの計算に使っているのでそのままコピーして使えるわけではありませんが。また、htpasswdは乱数に31bitしか使用していないので、48bit使用している別のソフトで暗号を生成する方が安心かもしれません。

xx の部分がsalt で、XXXXXXXXな部分がsaltとパスワードからハッシュを何度も繰り返したものです。乱数を混ぜる理由は、同じパスワードを使った場合に偶然同じ値になると、知られてしまうからです。乱数を混ぜることでその可能性は下がります。また、ハッシュ値が漏洩した場合に辞書的攻撃を難しくする目的もあります。shadowの中身を知ることができるのは管理者ぐらいですが、管理者でも知れるとまずい場合もありますね。

MD5 Cryptの場合は次のようなところでアルゴリズムが公開されています。これをJavaで実装してみたところ、同じハッシュが生成できました。DES Cryptについても、どこかにアルゴリズムは公開されていると思います。

参考にしようとしているところ

ネット上での確認

MD5で暗号化すると元のパスワードがわからなくなりますが、ネット上をそのまま流すには最適なのでしょうか? そういうところも後々調べてみたいと思います。

ApacheやHTTP的サーバの場合

BASIC認証は、パスワードがそのまんま流れますが・・・

Digest認証などではパスワードを問われるときに何やら出てきますが、あれと組み合わせることで、あらかじめハッシュ化したパスワードと照合することもできます。

PAMという仕組み

ユーザ認証はPAM (何かの略) という方法で取り替えられるようになっています。

[しいしせねっと]