4

使用 ruby​​-bcrypt 加密字符串时是否可以指定使用哪种盐?

我知道它不是很安全,但我只将它用于安全性不高的数据:我有一个平台,当用户删除他的帐户时,我仍然想知道该用户之前是否使用此电子邮件注册过(由于免费注册学分)。

所以我想我会用 Bcrypt 加密电子邮件(在删除之前),然后当用户想用这个电子邮件地址再次注册时,我可以在之后查询这个哈希是否存在?

但现在我意识到 bcrypt 总是产生一种新的盐......我可以以某种方式指定盐吗?

谢谢,

免责声明/注意:

一般来说,你永远不应该直接指定盐——它不安全!!!

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

创建你的共享盐,因为这不依赖于你想出一些“随机”的东西。

为了稍微提高安全性,您可以将盐与可搜索的哈希分开,并将其视为应用程序中的任何其他秘密数据。例如,将其设置为配置项,并且只存储 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 回答
1

这是一个非常古老的线程,但仍然......这是使用固定盐进行 bcrypt 的其他选项:

如果安全不是问题(仅仅是混淆):使用 md5

Digest::MD5.hexdigest 'some value'

优点:计算成本低(生成速度更快)

缺点:它的计算成本低(更快的黑客攻击)

如果安全是一个问题,您可以使用共享密钥(无哈希)对其进行加密。请参阅https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL.html#module-OpenSSL-label-Encryption

于 2019-05-16T08:19:54.090 回答