私はAES暗号化であるユーザーのパスワードを暗号化するために次の方法を使用しています。これが良い習慣なのか、それとも他の方法で従うべきなのかを知りたいだけです。誰かが「「SALT」を使用してみませんか。SALTAES暗号化を使用できますか?」と混乱させたため、Bellowは私が使用しているサンプルクエリです。
INSERT INTO user(id,passowrd) VALUES (1,AES_ENCRYPT('mypassword','key'));
私はAES暗号化であるユーザーのパスワードを暗号化するために次の方法を使用しています。これが良い習慣なのか、それとも他の方法で従うべきなのかを知りたいだけです。誰かが「「SALT」を使用してみませんか。SALTAES暗号化を使用できますか?」と混乱させたため、Bellowは私が使用しているサンプルクエリです。
INSERT INTO user(id,passowrd) VALUES (1,AES_ENCRYPT('mypassword','key'));
それはさておき..
ソルトは暗号化方式ではありません。辞書攻撃から保護するためにハッシュする前に、各パスワードにランダムに追加する必要があります。
可逆的なAES暗号化を使用してユーザーパスワードを保存しないでください。ユーザーのパスワードが何であるかは気にせず、ユーザーがそれを知っているだけです。したがって、パスワードを元に戻せる形式で保存しないでください。
代わりに、パスワードといくつかのランダムデータのSHA256やbcryptなどの安全な一方向ハッシュを使用します。このランダムなジャンクである「ソルト」は、ユーザーごとに生成され、ハッシュの前にパスワードに追加されます。その後、ハッシュされたデータとともにデータベースに保存され、後でパスワードを比較できるようになります。
このように、レインボーテーブル(ハッシュからプレーンテキストへのマッピングの大きな辞書)を持っている攻撃者は、「ああ、ジョーユーザーは自分のパスワードを「パスワード」にすることにしました!」と見ることができません。これにより、データベース内のすべてのパスワードをブルートフォース攻撃から保護することもできます。これは、各アカウントに独自の独立したソルトがある場合、各パスワードを個別に攻撃する必要があるためです。
ソルトは、ハッシュされようとしている文字列に追加される一連の文字であるため、攻撃者が元の文字列を取得するのは困難です。
ただし、ハッシュに基づかない暗号アルゴリズムの場合、攻撃者はソルトを含む元の文字列を取得するため、ソルトは必要ありません。ソルトを削除するにはロジックが必要です。
AES_ENCRYPTを使用すると、使用しているキーはソルトです。私はMD5やSHAのような一方向のハッシュを好みますが、多くの場合、保存しているような復号化可能なパスワードが好きです。