4

Is it possible to specify which salt is used when encrypting strings with ruby-bcrypt?

I know it's not very safe, but I only use it for not-high security data: I have a plattform, and when a user deletes his account, i still want to know if this user was registered with this email before (due to free credits on registration).

So I thought I will encrypt the email with Bcrypt (before deletion) and later I can query afterwards if this hash exists when the user wants to register again with this email address?

But now i realized that bcrypt always procudes a new salt... Can I specify the salt somehow?

Thanks,

DISCLAIMER/ATTENTION:

IN GENERAL YOU SHOULD NEVER SPECIFY SALTS DIRECTLY - ITS INSECURE!!!

4

3 に答える 3

10

はい、できます:

BCrypt::Engine.hash_secret( 'foo@example.com', "$2a$10$ThisIsTheSalt22CharsX." )

最初の 7 文字は技術的にはソルトではなく、bcrypt アルゴリズムを識別し、反復回数を 2**10 == 1024 に設定します。単純にするために、Ruby の bcrypt モジュールは最初の文字をソルトの一部として扱います。する必要もあります。おそらく使用する必要があります

BCrypt::Engine.generate_salt

共有ソルトを作成するには、「ランダム」なものを考え出す必要はありません。

セキュリティを少し向上させるために、salt を検索可能なハッシュから分離し、アプリ内の他の秘密データと同じように扱うことができます。たとえば、構成アイテムにして、検索用に bcrypt のハッシュ部分のみを保存します (最初の部分はとにかく冗長なデータであり、検索のパフォーマンスが低下しますが、その影響はおそらく非常に小さいです)。

email = 'foo@example.com'
full_hash = BCrypt::Engine.hash_secret( email, settings.email_search_salt )
searchable_hash = full_hash[29,31]
# Either store or search . . .
于 2013-10-25T08:06:16.417 に答える
5

を使用して電子メールを渡し、一意のソルトとともにこれらのハッシュを生成できますBCrypt::Password.create

2.0.0-p195 :003 > hashed_email = BCrypt::Password.create 'joe@test.com'
 => "$2a$10$vX2tl3omW9h4k66XC7/BwOFH0n7EqtH4PJATPa7YVSeJh7TEpt/bK" 
2.0.0-p195 :004 > hashed_email = BCrypt::Password.create 'joe@test.com'
 => "$2a$10$RdQIHtz.L5To1F1XRK//..h6nHYdQ3uJ2PTgB58e3xufoqgZGqbO6" 
2.0.0-p195 :005 > hashed_email = BCrypt::Password.create 'joe@test.com'
 => "$2a$10$bTFVXO/d0/sf6SxzCcRMU.zBPcR5yjI6ID6O9J2eXKbqim/jPM3PC" 
2.0.0-p195 :006 > hashed_email = BCrypt::Password.create 'joe@test.com'
 => "$2a$10$gbXU4UEiHTC0HCnD672Dm.TeBhZeCa6sBiX8Pk50KSXcprDJnEYA." 

固定ソルトの使用について心配する必要はありません。これは、BCrypt が既にハッシュと共に保存しているためです。

しかし、あなたが特定したと思うのは、「SELECT user WHERE email_hash = hash」を実行することはできないため、後で比較に関連する処理コストが発生することを意味するということです...

絶対に固定塩を使用したい場合は、使用できます。

salt = BCrypt::Engine.generate_salt
hash = BCrypt::Engine.hash_secret 'hello', salt

(そのソルト ストリングをどこかに保管しておくだけで、後で使用できます。)

于 2013-10-25T00:02:07.183 に答える