无法让SHA-256哈希与我的Spring安全性一起工作

我正在使用Spring Roo框架,它使用Spring Security作为安全框架。 我按以下方式配置它:

    <!--  -->        

为了使密码匹配,我编辑了UserController create方法,因此使用SHA-256哈希存储密码,与在安全配置文件applicationContext-security.xml配置的相同。

我是这样做的:

 public String create(@Valid User user, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) throws NoSuchAlgorithmException, UnsupportedEncodingException { if (bindingResult.hasErrors()) { populateEditForm(uiModel, usuario); return "security/users/create"; } MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(user.getPassword().getBytes("UTF-8")); byte[] digest = md.digest(); usuario.setPassword( new String(digest, "UTF-8")); uiModel.asMap().clear(); user.persist(); return "redirect:/security/users/" + encodeUrlPathSegment(usuario.getId().toString(), httpServletRequest); } 

我尝试将密码设置为admin ,这与默认用户提供的相同:admin,密码:admin配置文件,以检查我的create方法生成的密码是否匹配。

但是,配置文件中的散列密码是8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918但是当我在页面中显示时通过控制台或ivAMgsKo*H检查我的mysql数据库时,存储在数据库中的密码是一组奇怪的字符。

有帮助吗?

最后我提出了这个解决方案,感谢@Oleg Estekhin评论:

 public String sha256(String original) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(original.getBytes()); byte[] digest = md.digest(); return new String(Hex.encodeHexString(digest)); } 

但是,配置文件中的哈希密码是8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a8f6f2ab448a918,但是当我在页面中显示时通过控制台或ivAMgsKo * H检查我的mysql数据库时,存储在>数据库中的密码是一组奇怪的字符。

 8c6976e5b541041... 

看起来像Base64编码的数据。

  ivAMgsKo*H 

和你的代码

 new String(digest, "UTF-8") 

告诉我,你的摘要没有编码,但存储为UTF-8字符串。

哈希值可以包含不可打印的字节值,因此通常对值进行编码。 例如使用Base64。