我已经开发了下面的程序来生成OTP (一次性密码),现在请告知没有其他更好的和安全的方法,我可以在上下文中使用OTP
// Java code to explain how to generate OTP
// Here we are using random() method of util
// class in Java
import java.util.*;
public class NewClass
{
static char[] OTP(int len)
{
System.out.println("Generating OTP using random() : ");
System.out.print("You OTP is : ");
// Using numeric values
String numbers = "0123456789";
// Using random method
Random rndm_method = new Random();
char[] otp = new char[len];
for (int i = 0; i < len; i++)
{
// Use of charAt() method : to get character value
// Use of nextInt() as it is scanning the value as int
otp[i] =
numbers.charAt(rndm_method.nextInt(numbers.length()));
}
return otp;
}
public static void main(String[] args)
{
int length = 4;
System.out.println(OTP(length));
}
}发布于 2018-03-24 11:55:00
正如一条评论指出的那样,一次性密码只是一个随机数字或字符串。
查看您的代码,您使用的是Random类。这对于随机序列的质量在很大程度上无关紧要的应用是很好的。但是,Random的标准实现会产生高度可预测(自相关)的数字序列;请参阅https://stackoverflow.com/a/38345694/139985。您应该改用SecureRandom。
我怀疑你使用nextInt(numbers.length())会放大自相关...因此,如果您继续使用Random,Samwell的建议将有所帮助。
发布于 2021-04-09 02:51:45
使用Java,以下代码将生成一个4位数的8+。只需在random.ints(...)中替换4即可方法使用您的OTP中所需的位数。
编辑:我读到SecureRandom是另一个生成随机数的类(它提供了额外的安全性)。如果您愿意,可以根据自己的需要使用它,而不是很好的老Random类。
...
import java.util.Random;
//Or
//import java.security.SecureRandom;
...
Random random = new Random();
//Or
//SecureRandom random = new SecureRandom();
random.ints(4, 0, 10).mapToObj(Integer::toString).reduce((a, b) -> a + b)
.ifPresent(System.out::println);如果您想将值转换为字符串,而不只是打印它,那么:
String otp = random.ints(4, 0, 10).mapToObj(Integer::toString)
.reduce((a, b) -> a + b).get(); 发布于 2019-04-16 14:44:05
OTP只是一个固定长度的随机文本。只需一行代码即可实现(使用UUID)。参见下面的示例,该示例生成4个字符的动态口令。
UUID.randomUUID().toString().substring(0, 4)https://stackoverflow.com/questions/49460963
复制相似问题