web-dev-qa-db-ja.com

ハッシュする前にユーザーパスワードから文字を削除/追加して永久に隠しますか?

私は、最小の長さを要求してから特定の文字を削除することにより、ユーザーパスワードを永続的に隠すというこのアイデアを思いつきました。たとえば、ユーザーパスワードが_secret123_の場合、システムはそれを_ecrt12_に分解し、_ecrt12!@#$%^&*_のようにランダムな文字を追加してから、ハッシュ、ソルトの追加などを行い、DBに保存します。

すべての一般的な慣行を許可することも、次のように使用されました。

  • ユーザーごとの固有のソルト
  • システムペッパー
  • bcrypt/scryptまたは利用可能な最新の最高の暗号アルゴリズム

コードで要約すると:

$hash = hash($modifiedpassword.$uniquesalt.$systempepper) // 1000秒まで繰り返しました。

攻撃者がなんとかすべてのハッシュを元に戻すことができた場合、攻撃者が回復できる最善の情報は_ecrt12!@#$%^&*_であり、元の_secret123_ではありません。システムコードをハッキングしたとしても、どの文字が削除されたかはわかりません。

私の質問はセキュリティの専門家ですが、元のユーザーパスワードを削除/追加するこの方法をお勧めしますか?

1
IMB

同じユーザーがパスワードを入力するたびに「同じ」ランダム文字が使用されることをどのように保証しますか?それらを書き留める(または決定論的に生成する)場合にのみ保証できるため、「パスワード」の「!@#$%^&*」は実際には塩の別の部分にすぎません。

これにより、ユーザーのパスワードを「secret123」から正規表現「^ .ecret12。$」に変換した状態になり、パスワードの有効な複雑さが9文字から7文字に減少します。 「pecret129」を試みる攻撃者はで許可されます。

質問に直接回答し、以下のewanm89から見積もりを借りるには:いいえ。私はそれをすることをお勧めしません。

5
user185