まず、いくつかの用語を定義しましょう。
暗号化とは、メッセージを読み取れないようにエンコードすることです。暗号化には、平文、暗号、鍵が含まれます。本 (平文) を鍵のかかった部屋 (暗号) に入れるようなもので、既知のツール (鍵) を使用してのみ開くことができます。暗号にはいろいろな種類がありますが、簡単に説明します。暗号化は双方向です。つまり、メッセージをエンコードおよびデコードできます。
暗号化ハッシュとは、あらゆる種類のデータを取得し、その固定サイズの値を生成することです (通常、ハッシュまたはダイジェストと呼ばれます)。暗号化ハッシュは一方向であるため、プロセスを元に戻すことはできません。
ソルトは、ノンス(一度だけ使用される一意の番号)に似た、一意の文字列またはビットの集まりです。ソルトは、クラッカーがハッシュのリストを処理できないようにするためにのみ使用されます。それらは秘密として使用されることは想定されていません (つまり、暗号化キーのように)。ソルトに関して人々が通常ランダム性について話す唯一の理由は、ユニークなソルトを生成したいからです (例えば、ランダム性が十分に大きくない場合、ソルトが衝突する可能性があります)。
さて、パスワードをハッシュする方法について説明します。
パスワードをハッシュする比較的安全な方法は、一意のハッシュをパスワードに追加し、ソルトをパスワードとともに保存することです。
$pass = 'this is my password';
$salt = uniqid('', true);
$hash = sha1($pass . $salt);
// INSERT INTO users ('hash', 'salt') VALUES ('$hash', '$salt') WHERE ...
Web サイトがユーザーから機密データを取得しない場合は、これで問題ありません。
機密データを扱う場合、またはデータを安全に保つためにできる限りのことを確実に行いたい場合は、ハッシュ化を行う PHP 関数があります。これは呼び出されcrypt()
ます (どのように機能するかについては、ドキュメントを参照してください)。関数を使用してパスワードをハッシュする方法の例を次に示します。
$pass = 'this is my password';
$salt = 'unique string';
$hash = crypt($password, '$2y$07$'.$salt.'$');
echo $hash;
これにより、パスワードが安全にハッシュされます。
認識すべきことは、このcrypt()
機能はあなたが思いつくよりもはるかに安全であるということです (あなたがその分野の専門家でない限り)。
PHP の新しいバージョン (5.5.0 以降) には、パスワードのハッシュをさらに簡単にするパスワード ハッシュ APIがあります。
そこにはさまざまなハッシュライブラリもあります。PHPassは人気があります。