ハッシュと暗号化

2016/06/05

基本

ハッシュ」は「何かしらのルール」にしたがって「別の文字列」に置き換え元に戻すことができない。
※「不可逆な一方向関数」っての含まれているらしく戻せないっていうコトらしい。

暗号化」は「復号化」で元に戻せる。

「ハッシュ化された文字列」から「元の文字列」を知りたい場合は「任意の文字列をハッシュ化」して正解か確認する。
※ログインするときの処理の場合。
 前段階として、パスワード登録時にハッシュ化した文字列を保存する。
 ログイン時に「入力されたパスワードをハッシュ化」して、「保存されているハッシュ化されたパスワード」と比較。
 それで、ログイン成功・失敗って流れになる。

そのため、「元の文字列」が安易に想像できる場合、簡単にバレてしまう。

ハッシュ化

「ハッシュ化」には「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()」で複合化(暗号化された文字列を元に戻す)。

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい