2 回答
TA贡献1817条经验 获得超14个赞
非常简单 - 只需将您的weDoNotWantEncryption()
函数替换为返回 BCrypt 实例的函数:
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
BCryptPasswordEncoder
实现PasswordEncoder
(顾名思义),因此已经为encode()
和定义了好的方法matches()
。
请注意,这将(当然)使当前在您的数据库中的任何密码都无法使用,尽管鉴于这些密码以明文形式存储,我假设(并希望/祈祷)这是在测试环境中,而不是在生产环境中。
TA贡献1860条经验 获得超9个赞
当我们加密存储密码时,我们通常对它们进行哈希处理,以便它是一种单向加密,即即使我们知道哈希算法,我们也无法从加密的密码中检索到原始密码。
我们遵循的主要程序如下。
取字符串“密码”
向密码添加盐(一个随机字符串,以确保具有相同密码的多个用户没有相同的散列密码):随机盐:“A3fcherf42”,生成的字符串:“A3fcherf42password”
使用加密算法散列此字符串,您可能会得到:“d143d1w132dd23dsgrg5”
将盐附加到加密密码以供将来验证用户登录时使用:“A3fcherf42d143d1w132dd23dsgrg5”
用用户id保存在数据库中
现在验证用户登录:
从登录表单中获取密码,即“密码”
读取存储在数据库中的哈希值:“A3fcherf42d143d1w132dd23dsgrg5”
从存储的散列密码中提取盐:“A3fcherf42”
将盐附加到用户输入的密码:“A3fcherf42password”
哈希密码,现在生成的哈希值应该与存储在数据库中的哈希值匹配。
使用 Bcrypt 执行此操作是一个简单的过程,因为大部分工作都由库处理。我解释了上面的场景,以便您对幕后发生的事情有一个很好的理解。您执行以下操作以生成并保存散列密码。
String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
现在您有了散列字符串,将其存储到数据库中。
当用户登录时,您获取他输入的密码、数据库存储的哈希字符串,并对其进行验证。
if (BCrypt.checkpw(entered_pw, stored_hash)) return True;
添加回答
举报