使用Spring Security,Spring Boot和MongoDB进行密码编码和解码

qum*_*uma 8 spring mongodb password-encryption

我使用上面提到的软件堆栈,我需要在保存到数据库之前加密密码.我还需要解密密码,因为当有人更改密码时,她需要输入旧密码,然后新的onw两次,我需要检查旧密码.我搜索了很多,但我仍然不确定这是怎样的正确方法.我找到了这个链接加密,但还有其他提示吗?我也不确定MongoDB是否提供了保护密码的功能.

Ral*_*lph 24

首先阅读Steven Carlson关于密码哈希的答案.

好处是Spring Security会为你做这件事.Spring Security 3.2引入了新的org.springframework.security.crypto.password.PasswordEncoder接口和一些实现:BCryptPasswordEncoder,StandardPasswordEncoder(和NoOpPasswordEncoder).

重要提示:不要与旧的弃用混淆org.springframework.security.crypto.password.PasswordEncoderorg.springframework.security.authentication.encoding.PasswordEncoder

接口(以及实现)具有您需要的两种方法:

  • public String encode(CharSequence rawPassword)
  • public boolean matches(CharSequence rawPassword, String encodedPassword)

我建议使用org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder.的BCryptPasswordEncoder(在对比的StandardPasswordEncoder)使用的盐是每个密码(但不是像全球从所述一个不同StandardPasswordEncoder).当您对原始密码(public String encode(CharSequence rawPassword))进行编码时,返回的编码密码不仅仅是编码密码,它还包含有关使用的哈希算法,使用的盐以及编码密码的一些元信息.


小智 20

你根本不应该"加密"密码.我知道这听起来很反直觉.但是系统应该需要解密密码是没有理由的.这样做会将您的数据库打开给黑客,因为如果您将解密密码存储在代码/服务器中,黑客就可以窃取该信息.

正确的过程是hash密码.哈希是单向的(不能被解除回原始文本)过程.目前的标准是使用SHA256来哈希密码.这是一个基本的流程图:

  1. 获取用户提交的密码.密码"mypass"的示例将散列为ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
  2. 将此hash(ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222)存储在数据库中.

当用户登录时,您将获取他刚刚提交的密码并将其哈希.如果他输入相同的密码,它将在数据库中散列为相同的值.

当用户去更改密码时,您可以使用"输入旧密码"来验证旧密码是否仍然匹配,如果是,请勾选"输入新密码"并保存.

在我的例子中我没有提到的一件事是salt.这是您必须在系统中使用的,因为它可以保护您的数据免受rainbow table攻击.但这是另一个讨论.

希望这可以帮助 :)