无法让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。