Bvu*_*Ic7 3 ruby ruby-on-rails bcrypt bcrypt-ruby
使用ruby-bcrypt加密字符串时是否可以指定使用哪种盐?
我知道它不是很安全,但我只使用它来获得不高的安全数据:我有一个平台,当用户删除他的帐户时,我仍然想知道此用户之前是否已注册此电子邮件(由于免费)注册学分).
所以我想我会用Bcrypt加密电子邮件(删除之前),之后我可以查询当用户想要再次注册这个电子邮件地址时是否存在这个哈希?
但现在我意识到bcrypt总是采用新的盐...我可以用某种方式指定盐吗?
谢谢,
免责声明/注意:
一般来说,你不应该直接指定盐 - 它的不确定!
是的你可以:
BCrypt::Engine.hash_secret( 'foo@example.com', "$2a$10$ThisIsTheSalt22CharsX." )
Run Code Online (Sandbox Code Playgroud)
前7个字符在技术上不是盐,它们识别bcrypt算法,并将迭代次数设置为2**10 == 1024.为简单起见,Ruby的bcrypt模块将第一个字符视为salt的一部分,所以你还需要.你可能应该使用
BCrypt::Engine.generate_salt
Run Code Online (Sandbox Code Playgroud)
创建共享盐,因为这不依赖于你提出"随机"的东西.
为了提高安全性,您可以将盐与可搜索的哈希分开,并将其视为应用程序中的任何其他秘密数据.例如,将其设置为配置项,并且仅存储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 . . .
Run Code Online (Sandbox Code Playgroud)
您可以使用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."
Run Code Online (Sandbox Code Playgroud)
现在,您不必担心使用固定盐,因为BCrypt已将其与哈希一起存储给您。
但是我想您已经确定的是,这意味着以后会产生与比较相关的处理成本,尽管您不能只是执行“ SELECT user WHERE email_hash = hash”。
如果您绝对要使用固定盐,可以。
salt = BCrypt::Engine.generate_salt
hash = BCrypt::Engine.hash_secret 'hello', salt
Run Code Online (Sandbox Code Playgroud)
(只需将盐串存储在某个地方,以后就可以使用。)
| 归档时间: |
|
| 查看次数: |
3637 次 |
| 最近记录: |