安全号码生成器验证身份验证

时间:2019-01-09 23:26:05

标签: java

我的代码使用安全随机数生成器生成字母/数字的随机序列,但是当要在控制台中验证代码时,验证失败。另外,有一种方法可以将生成的单个文件保存一定的时间。

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

}

2 个答案:

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