web-dev-qa-db-ja.com

コショウをbcryptに正しく適用する方法は?

更新:ペッパーとして使用するよりも、サーバー側のキーを追加するより良い方法があります。コショウを使用すると、攻撃者はキーを取得するためにサーバーで追加の権限を取得する必要があります。最初にハッシュを計算し、その後でサーバー側のキーを使用してハッシュを暗号化する(双方向暗号化)ことで得られる同じ利点。これにより、必要なときにいつでも鍵を交換することができます。

データベースのパスワードをハッシュするために、ハッシュ関数にペッパーを追加したいと思います。もちろん、このコショウはユニークな塩に追加されます。

コショウを追加したい理由は、攻撃者がデータベースにのみアクセスでき、サーバーにはアクセスできない場合(Sql-Injectionの場合)に、辞書攻撃を防ぐためです。私の意見では、ペッパーがハードコードされているだけでも(コードの複雑さを避けるため)、ペッパーなしのハッシュよりも優れています。

ここで、ペッパーを正しく適用する方法を教えてください。ハッシュする前に、ペッパーをパスワードに追加するだけでよいのでしょうか。

1.パスワードとコショウを連結する

$passwordHash = bcrypt($password . $pepper, $salt);

これに対する理由としては、bcryptの制限(55文字)より大きいパスワードはペッパーを取得できないことが考えられます。ただし、この長さのパスワードはおそらく辞書にないはずです。この制限があるため、ペッパーはパスワードの前ではなく、パスワードの後に​​追加されます。別の理由としては、攻撃者がペッパーを知っている場合は、ペッパーで保護されたすべてのパスワードの末尾も知っていることが考えられます。

2.パスワードとコショウをハッシュと組み合わせる

$passwordHash = bcrypt(hash('sha256', $password . $pepper), $salt);

したがって、ハッシュ関数を使用して、ハッシュする前にパスワードとペッパーを組み合わせることができます。後でbcryptを使用する場合、sha256を使用するのが適切ですか、またはどのハッシュ関数が理想的ですか?

3.パスワードとペッパーをhmacと組み合わせる

$passwordHash = bcrypt(hash_hmac('sha256', $password, $pepper), $salt);

多くの場合、hmacが推奨されるソリューションですが、SHA256を直接使用するよりも優れている点はありますか?パスワードとペッパーのみを組み合わせたいので、セキュリティは後でbcryptから取得されるため、明らかな利点はわかりません。

役立つヒントは大歓迎です。

38
martinstoeckli

あなたの3つの方法は正しいです。 3番目の(HMACを使用した)は、数学的に言えば、少し「エレガント」かもしれません。これは、bcryptやHMACのセキュリティと比較して、構造のセキュリティを証明するのを容易にします。

ただし、nullバイトには注意してください。与えられたbcrypt実装は文字列を期待し、値0の最初のバイトで停止する場合があります。これは、SHA-256またはHMAC(または使用するバイナリキーの一部として)の出力で発生する可能性があります。 pepper)、後続のすべてのバイトを無視します。それは重大な問題であり、あなたはそれに気付かないでしょう。この問題を回避するには、bcryptに渡す前にSHA-256またはHMAC出力をBase64エンコードすることをお勧めします(Base64エンコードのSHA-256出力は44文字ですが、bcryptの制限を下回っています)。

31
Thomas Pornin