我的代码使用安全随机数生成器生成字母/数字的随机序列,但是当要在控制台中验证代码时,验证失败。另外,有一种方法可以将生成的单个文件保存一定的时间。
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Base64.Encoder;
import java.util.Scanner;
public class PasswordGenerator {
public void generatePassword() {
System.out.println(generateSafeToken());
}
private String generateSafeToken() {
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
Encoder encoder = Base64.getUrlEncoder().withoutPadding();
String token = encoder.encodeToString(bytes);
return token;
}
public void verify() {
Scanner sc = new Scanner(System.in);
System.out.println("Enter code: ");
String myToken = sc.next();
if (generateSafeToken().equals(myToken)) {
System.out.println("Code Verified");
}
System.out.println("Not Verified");
sc.close();
}
}
答案 0 :(得分:1)
您正在生成一个新令牌并尝试针对该令牌进行验证:
if (generateSafeToken().equals(myToken))
两个随机生成的令牌几乎不可能相同。而是存储第一个并与存储的值进行比较。可能很简单:
private string randomToken;
public void generatePassword() {
this.randomToken= generateSafeToken();
System.out.println(this.randomToken);
}
然后与之比较:
String myToken = sc.next();
if (this.randomToken.equals(myToken)) {
System.out.println("Code Verified");
} else {
System.out.println("Not Verified");
}
扩展逻辑时,可以对空值进行一些错误检查,确保按预期顺序调用方法,或者将令牌存储在类之外的其他位置,等等。(例如,最后一个一个注册系统,在该系统中,令牌是通过电子邮件发送给用户的,后来需要验证,您需要将其保存在某个地方,例如数据库中。)
答案 1 :(得分:0)
的问题是,它是调用generateSafeToken方法在验证方法,而不是保存令牌预先与vigency日期的地图
上产生private static final Map<String, Calendar> TOKENS = new HashMap<>();
在生成日期(例如2小时)后保存地图令牌
public void generatePassword() {
String token = generateSafeToken();
Calendar valideEnd = Calendar.getInstance();
valideEnd.add(Calendar.HOUR, 2);
TOKENS.put(token, valideEnd);
System.out.println(token);
}
在地图中验证搜索令牌,并将开始日期与当前日期进行比较
public void verify() {
Scanner sc = new Scanner(System.in);
System.out.println("Enter code: ");
String myToken = sc.next();
if (TOKENS.containsKey(myToken) && TOKENS.get(myToken).after(Calendar.getInstance())) {
System.out.println("Code Verified");
} else {
System.out.println("Not Verified");
}
sc.close();
}