パスワードを扱うのに生パスワードをデータベースに挿入するのではなく、MD5でハッシュ化したものをデータベースに変換するtipsを考えていきます。8月28日記事

目次





そのままパスワードを入れるのは危険

「password」というパスワードをそのままデータベースに入れるとデータベースのテーブルを盗まれた時に、全ユーザのパスワードが盗まれることになります。そこでmd5というハッシュ化アルゴリズムを使ってハッシュ化します。MD5はダイジェスト関数と呼ばれ、入れられた文字列をハッシュ化します。ハッシュ化とは簡単にいえば、ある一定の規則によって内容を省略した記載にしていくというものです。例えば「This is an apple」を一定の規則(先頭の文字を抜いて並べる)に従って行っていくと、「Tiaa」となります。このように入れられた文字をmd5は 0~fまでの32文字の文字列 にしていく方法がmd5です。

しかし、簡単に変換したとしても危険

世の中のWEBサイトにはレインボーテーブルというものが存在し、md5化されたデータを集めて、md5化された文字列の元のもの(パスワード)は何か、導き出すサイトが存在します。例えば、passwordをmd5でハッシュ化すると、5f4dcc3b5aa765d61d8327deb882cf99となり、これはよく知られています。

そこでパスワードSALTというものを行う。

passwordという文字列をmd5でハッシュ化する関数はmd5関数であり、

echo md5('password');

と書きます。このように書くと5f4dcc3b5aa765d61d8327deb882cf99というように出てきます。 そこで、passwordという8文字だけでなく、ある文字列を適当に加えて、md5でハッシュ化すると、5f4dcc3b5aa765d61d8327deb882cf99ではなくなります。コードを書いていきましょう。

コード

追加する文字列は適当にパスワード生成サイトから持ってきました。

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>MD5のハッシュ化</title>
</head>

<body>
<form action="index.php" method="post">
<p>パスワードを入力してください。</p>
<input type="text" name="pass" />
<input type="submit" name="sub" value="発行" />
</form>

<?php

if(isset($_POST["sub"])){
	print '<br />';
	print $_POST["pass"];
	print '<br />が元のパスワードで<br />';
	print 'ただ単にmd5化すると<br />';
	print md5($_POST["pass"]);
	print '<br />で、さらにソルト化すると<br />';
	print md5($_POST["pass"].'DN8N7SKq');
}


print '<br />';
print 'その他:passwordのMD5値は<br />'.md5('password');
print '<br />';
?>

</body>
</html>

このように記述して、passwordというパスワードを入力してみると、5f4dcc3b5aa765d61d8327deb882cf99とは違くなるはずです。

まとめ

このようにして、データベースに格納していけば、だれもわからないパスワードになります。また、開発者側はデータベースとパスワードを照合するときもDN8N7SKqというものを加えて合致しているかというプログラムを書けば照合はできます。このようにパスワードが守られる仕組みになっています。md5以外にも色々なハッシュ化アルゴリズムは存在します。それは色々なハッシュ化アルゴリズムとソルト化で行っていきます。

以上

最終更新:2015年10月05日 01:54