基于时间戳和电话号码的盐随机数

时间:2016-03-15 08:27:13

标签: java

我正在使用下面的代码生成一个随机的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;
    }

1 个答案:

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