Java 生成动态密码重置链接
要重置密码,我想向用户发送一个指向site/account/{hash}的链接,{hash}是用户密码和时间戳的哈希。Java 生成动态密码重置链接,java,spring-boot,Java,Spring Boot,要重置密码,我想向用户发送一个指向site/account/{hash}的链接,{hash}是用户密码和时间戳的哈希。 我有以下代码只对电子邮件进行散列,并且有一个可读的链接: String check = info.mail; MessageDigest md = MessageDigest.getInstance("SHA-1"); String checkHash = Base64.encodeBase64String(md.digest(check.getByte
我有以下代码只对电子邮件进行散列,并且有一个可读的链接:
String check = info.mail;
MessageDigest md = MessageDigest.getInstance("SHA-1");
String checkHash = Base64.encodeBase64String(md.digest(check.getBytes()));
if(checkHash.equals(hash)){
return ResponseEntity.ok("Password reset to: " + info.password);
}else{
return ResponseEntity.ok("Hash didn't equal to: " + checkHash);
}
问题是,当我将其转换为Base64时,它可能会包含/标记会弄乱我的链接和哈希检查的内容。
我可以简单地在散列后用其他符号替换任何不需要的符号,但是是否有其他方法让散列只包含代码的某一部分
另外,我知道返回仍然是不安全的,但这只是为了测试和调试。通常被称为“base64url”,专门为此目的而设计。在此变体中,+
和/
被-
和
替换
Java8内置了对新版本的支持。如果您使用的是旧版本,可以使用newbase64(true)
构造函数将配置为url安全
其他选择可能是:
- 不要使用Base64,而是将字节转换为十六进制 表示(不包含任何特殊字符): 与
- 对生成的哈希使用URL编码/解码(这是您已经知道的)
String checkHash = toHex(md.digest(check.getBytes()));
private static String toHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}