我正在使用下面的代码生成一个随机的8位数字代码,但我想通过使用一些用户数据来保护它,因为一个简单的脚本最终可以找到。关于如何根据unix时间戳和/或电话号码(减去短划线)来增加这个值的想法?
public static void main(String[] args) {
System.out.println(generateRandomPassword());
}
public static String generateRandomPassword() {
Random random = new SecureRandom();
int CODE_LENGTH = 8;
final String letters = "0123456789";
String pw = "";
for (int i = 0; i < CODE_LENGTH; i++) {
int index = (int) (random.nextDouble() * letters.length());
pw += letters.substring(index, index + 1);
}
return pw;
}
答案 0 :(得分:1)
存储哈希版密码时使用Salt。像这样:
无盐:密码 - &gt;哈希函数=&gt;哈希密码(可以检索用户密码)
用盐:盐+密码 - &gt;哈希函数=&gt;哈希密码(除非您也知道盐,否则无法检索密码)
如果我正确理解您的问题,您希望将phonenumber或timestamp作为种子添加到随机数生成器,以确保接近真正的随机性。 SecureRandom构造函数返回一个未种子的生成器。调用setSeed()方法来提供种子。像这样:
public static void main(String[] args) {
String phone = "1234567890";
long seed = Long.valueOf(phone) * 1000 + System.currentTimeMillis() % 1000L;
System.out.println(generateRandomPassword(seed));
}
public static String generateRandomPassword(long seed) {
Random random = new SecureRandom();
random.setSeed(seed);
int CODE_LENGTH = 8; // Make this static
Long randomLong = random.nextLong();
String pw = Long.toString(randomLong).substring(1, CODE_LENGTH+1); //
return pw ;
//simplified
//return Long.toString(random.nextLong()).substring(1, CODE_LENGTH+1);
}