有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

  1. # 1 楼答案

    存储散列版本的密码时使用Salt。像这样:

    无盐:密码->;哈希函数=>;哈希密码(可以检索用户密码)

    含盐:盐+密码->;哈希函数=>;散列密码(除非您也知道密码,否则无法检索密码)

    如果我正确理解了您的问题,您希望将电话号码或时间戳作为种子添加到随机数生成器中,以确保近乎真实的随机性。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);
    }