是的你可以:
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 . . .