私はcrypt()
次のようにPHPで暗号化を使用しています:
<?php
$password = sanitizing_func($_POST['password']);
$var = crypt($password, 'ab');
?>
これはどれくらい安全ですか?
ここでより良い解決策を見つけました:openwall phpass
エドワードトムソンに感謝します
私はcrypt()
次のようにPHPで暗号化を使用しています:
<?php
$password = sanitizing_func($_POST['password']);
$var = crypt($password, 'ab');
?>
これはどれくらい安全ですか?
ここでより良い解決策を見つけました:openwall phpass
エドワードトムソンに感謝します
crypt
最初の引数としてパスワードを使用し、2番目の引数としてソルトを使用して、設計された方法を使用する場合よりも安全性が低くなります。
これで、ユーザーのパスワードをソルトとして使用して、既知のプレーンテキストを暗号化しています。システムでMD5を使用している場合はcrypt
、ソルトスペースを12文字に制限しているため、ユーザーパスワードのスペースを12文字に切り捨てています。さらに悪いことに、私のシステムでは、暗号を指定するためにソルトにプレフィックスを使用する必要があります。そうしないと、古い学校になりcrypt
ます。つまり、ソルトには2文字が必要です。そのため、ユーザーパスワードの可能な長さを2文字に制限しました。さらに、この時点で実行しても意味がありません。後続の呼び出しで同じソルトを渡すことができるcrypt
ように、ソルトが暗号文のプレフィックスとして付けられているため、2文字のパスワードを保存するだけでもかまいません。crypt
また、ソルトの文字スペースはAZ、az、0-9、 "。"、 "/"に制限されているため、ソルトで使用することでパスワードの文字スペースを制限しています。コード例から引数を切り替えても、すべての呼び出しに同じソルトデータを使用しています。これは、すべてのパスワードが同じソルトを持っていることを意味します。したがって、パスワードテーブルが公開されている場合、辞書攻撃を使用して解読する方が計算コストが低くなります。
言い換えれば、パスワードとソルト引数を交換することは致命的な間違いです。
最後に、cryptを2回呼び出す理由はありません。より優れた暗号化が必要な場合は、より優れたアルゴリズムを使用し、頻繁に呼び出さないでください。たとえば、DES暗号化を使用している場合、何度呼び出しても、それは依然として古いアルゴリズムです。(アルゴリズムの複数のパスが誤って弱められた暗号文を生成する可能性があることを読んだことも覚えているようです。しかし、私の前にシュナイアーがいません。)
実行したいのは業界標準です。強力な暗号を使用し、最初の引数としてパスワードを渡し、 2番目の引数としてランダムなソルトデータを渡し、ソルトに許容される最大バイト数を渡していることを確認します。