3

別のシステムに接続するためのシステムを構築しているため、パスワードを保存しなければならない状況があります。この別のシステムでは、単一のユーザー アカウントしか許可されておらず、それに接続する唯一の方法はパスワードを使用することです。ここではハッシュは適切ではありません。パスワードを取得できる方法で保存する必要があります。

現在、これが完璧なシステムではないことを知っているので、誰かが何らかの方法でデータベースにアクセスした場合の被害を最小限に抑えようとしています. このデータベースはさまざまなプラットフォームで使用する必要があるため、MySQL 独自の組み込み暗号化機能を使用することにしました。このように、さまざまな言語やシステムで互換性のある暗号化/復号化アルゴリズムの実装を見つけることを心配する必要はありません。クエリで MySQL の関数を使用するだけです。

パスワードを保存するときは、 を使用しますAES_ENCRYPT("password", "encryption key")。それから、彼らが 1 つのパスワードを取得できたとしても、他のパスワードを取得するのが難しくなるように、多少のソルトを使用する必要があることに気付きました。ちょっと待って!ポイントは?1 つのパスワードを取得できる場合、暗号化キーを持っている必要があります。

しかも、これはブロック暗号です。塩は状況によってはほとんど役に立たないことがあります。

/* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362FBB5D173CBAFA44DC406B69D05A2072C */
SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassword", "encryption key"));

/* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362C49AF8D5B194770E64FEF88767206391 */
SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassworda", "encryption key"));

私の質問

  • 私のような状況で対称暗号化を使用する場合、塩を使用する理由はないと考えるのは正しいですか?

  • 元の値を取得できるようにパスワードを保存する必要がある場合、他に検討すべき方法はありますか? (暗号化キーをどこにどのように保存するかについて注意する必要があること、および MySQL ログも保護する必要があることを認識しています。)

4

1 に答える 1