今日は「ハッシュ化」についての解説をまとめました、是非最後まで読んでいってくださいね!
そもそも、ハッシュ化とは?
あるデータを固定長の別のデータに変換するプロセスのこと
「ハッシュ化とは、ハッシュ関数と呼ばれる特殊な計算方法によって、一見ランダムに見える別の値(ハッシュ値)にデータを変換する方法」
、、、つまり、どういうことだ?
生成AIがイメージする「ハッシュ化」
なぜハッシュ化を行うのか?
ハッシュ化とは特定の計算手法に基づいて、元のデータを不規則な文字列に置換する処理を指す。代表的な使用方法としては、パスワードをハッシュ化して保存・管理することが挙げられる。
第三者が不正にパスワードへアクセスしたとしても、ランダムな文字列に変換されていることで、悪用されるのを防げるためだ。
https://eset-info.canon-its.jp/malware_info/special/detail/211013.html
つまり、ハッシュ化を行うことで、元の文字列をランダムな文字列に変換することができ、万が一DBの情報にアクセスされた場合にも元の値を知ることができない、ということだ。
パスワードをそのままDBに保管しておくのは危険だからね。
以下にハッシュ化のサンプルコードを付けておきます、こうして文字列をハッシュ化するのだ
<?php
//SHA512
var_dump(hash('sha512', 'パスワード'));
//SHA256
var_dump(hash('sha256', 'パスワード'));
//SHA1
var_dump(hash('sha1', 'パスワード'));
//MD5
var_dump(hash('md5', 'パスワード'));
//RIPEMD160
var_dump(hash('ripemd160', 'パスワード'));
//CRC32
var_dump(hash('crc32', 'パスワード'));
//SHA512-CRYPT(Dovecot用パスワード)
$salt = substr(sha1(rand()), 0, 16);
var_dump('{SHA512-CRYPT}' . crypt('パスワード', "$6$$salt"));
?>
ハッシュ化の種類
ハッシュ関数の主な種類には、「MD5」「SHA-1」「SHA-2」「SHA-3」があります。
他にも色々なハッシュ関数がありますが、ここでは上記の3つについて紹介していきます!
「MD5」
Ronald Rivestという方が1991年に作ったハッシュ関数の一つ
任意の長さの入力値に対して128ビットのハッシュ値を出力します。
今はあまり使われていない、というのも衝突困難性が破られてしまったからなんだ
(衝突困難性とは、hash(message1) = hash(message2)
となる場合があるということ。詳しくはググってみてください!)
これにより、安全性が担保できなくなり、次に初回する、「SHA-1」「SHA-2」「SHA-3」などが使われるようになったわけだ「SHA-1」1995年に発表された規格で、160ビットのハッシュ値を生成する。
異なるデータからハッシュ値が同じになることを利用した衝突攻撃のリスクがあるため、現在は利用が推奨されていない。
「SHA-2」
SHA-1を改良し、2001年にNIST(米国標準技術研究所)によって標準化された規格である。
ハッシュ値の長さに応じて、SHA-224、SHA-256、SHA-384、SHA-512が定義されている。
ハッシュ値が長ければ長いほど安全性が高いとされ、最近はSHA-256やSHA-512が主流となっている。
ハッシュ値が長い方が衝突しにくいから安全性が高いのはイメージしやすいかもしれませんね
「SHA-3」
SHA-2よりも安全性を向上させるために、2015年に公開された後継の規格となる。
「SHA」との名称を引き継いでいるものの、内部構造などが異なるなど、SHA-2とは別系統として設計されているのが特徴とされる。
今後、SHA-3の利用が増えていく可能性が見込まれている。
「SHA-3」生成の例
https://www.milk-island.net/javascript/hashgenerator/sha3.html
それぞれの方式でハッシュ値を生成すると以下のようになる、元の文字列が同じでもハッシュ化の方式によって生成されるハッシュ値が異なることがわかる
http://webadmin.jp/toolhash/
Laravelにおけるハッシュ化
Laravelにはbcryptという関数が用意されています非常に簡単に安全性の高いハッシュ値を生成できる関数です>使用例
$password = bcrypt('my-secret-password');
>bcryptの定義
function bcrypt($value, $options = [])
{
return app('hash')->driver('bcrypt')->make($value, $options);
}
Laravelではbcryptを使用してハッシュ化を行うことが多いですLaravelにはこのように便利な関数が用意されているので、ぜひ習得してみてくださいね!
まとめ
ハッシュ化について紹介してみました!少しでも参考になってもらえたら幸いです
興味が出たら、ぜひ以下のリンクから応募ボタンからエントリーしてみてください!
https://www.wantedly.com/companies/company_5445568
ラッパマークの「応援する!」も押していってください、励みになります!