ハッシュと暗号化
基本
「ハッシュ」は「何かしらのルール」にしたがって「別の文字列」に置き換え元に戻すことができない。
※「不可逆な一方向関数」っての含まれているらしく戻せないっていうコトらしい。
「暗号化」は「復号化」で元に戻せる。
「ハッシュ化された文字列」から「元の文字列」を知りたい場合は「任意の文字列をハッシュ化」して正解か確認する。
※ログインするときの処理の場合。
前段階として、パスワード登録時にハッシュ化した文字列を保存する。
ログイン時に「入力されたパスワードをハッシュ化」して、「保存されているハッシュ化されたパスワード」と比較。
それで、ログイン成功・失敗って流れになる。
そのため、「元の文字列」が安易に想像できる場合、簡単にバレてしまう。
ハッシュ化
「ハッシュ化」には「SHA1」「MD5」などがある。
内容としては「元の文字列」を「何かしらのルール」にしたがって処理している。
コレだと元の文字列が何であろうと時間をかければわかるらしい。
※「不可逆な一方向関数」っての含まれているらしく戻せないっていうコトらしい。
そのため、「元の文字列」を「何かしらのルール」に「特定の文字列」を組合せて処理するのが望ましいらしい。
コレだと「特定の文字列」が分からないと「元の文字列」が分からないってコトだそうだ。
※「特定の文字列」ってのが「salt(ソルト)」や「暗号鍵」「秘密鍵」などと呼ばれたりしている。
PHPのハッシュ化の関数
PHPで「ハッシュ化」する関数はいくつかある。でも「hash_hmac()」を使うのが無難っぽい。
- sha1() – saltの設定が無い
- md5() – saltの設定が無い
- hash() – saltの設定が無い
- hash_hmac() – saltの設定が出来る
- crypt() – saltの設定が出来る。他のサイトを見る限りあまり使わないほうがいいらしい。
※「crypt()」がダメな理由は「標準のDESベースの場合、crypt()は出力の最初の2文字をsaltとして使用します。また、strの最初の8文字しか使用しません。つまり、最初の8文字が同じである長い文字列は、同じsaltを使う限り同じ結果となります。」となっているかららしい。
「秘密鍵」と「salt」
「秘密鍵」と「salt」は同じだと思うんだが、違うかもしれない。
※「hash_hmac()」は「$key(秘密鍵)」、「crypt()」は「$salt(salt)」と表記が異なっている。
暗号化
PHPの場合、OpenSSL関数を使えばいいそうだ。
「openssl_encrypt()」でいいそうだけど、別に「秘密鍵(openssl_private_encrypt())」「公開鍵(openssl_public_encrypt())」のそれぞれで暗号化ってのもある
「openssl_encrypt()」で暗号化、「openssl_decrypt()」で複合化(暗号化された文字列を元に戻す)。