Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成动态密码重置链接_Java_Spring Boot - Fatal编程技术网

Java 生成动态密码重置链接

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

要重置密码,我想向用户发送一个指向site/account/{hash}的链接,{hash}是用户密码和时间戳的哈希。
我有以下代码只对电子邮件进行散列,并且有一个可读的链接:

    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();
}