java - PBKDF2WithHmacSHA1 令人困惑

标签 java

谁能告诉我下面代码中的128*8有什么用? 我已经写了密码加密的代码,但我仍然不知道这个128*8是做什么的。

这是我从这段代码中得到的返回值:

67a0759ac6266ca2156555426aae10b18c34b436ea036247e6c0e16cd8d4199b9df508c32cd14e50a533ac00c071888cb8167982d9bf22a89ccd1c02a9d9c76 d4e5fb5c3be91711a444a3b453c54790d5b540d7f3d0ef5798cf6a08e5acaf1b0fb445e174befd2e5b97978534aa7c22c4e404503e40f06f6832fe4a5843c9b01

toHex() 函数如下:我认为返回值以字符为单位。

private static String toHex(byte[] array) throws NoSuchAlgorithmException
    {
        BigInteger bi = new BigInteger(1, array);
        String hex = bi.toString(16);
        int paddingLength = (array.length * 2) - hex.length();
        if(paddingLength > 0)
        {
            return String.format("%0"  +paddingLength + "d", 0) + hex;
        }else{
            return hex;
        }
    }



public static String encrypt(String password,String key) throws NoSuchAlgorithmException, InvalidKeySpecException {

       int iterations = 4096;
        char[] chars = password.toCharArray();
        byte[] salt = key.getBytes();

        PBEKeySpec spec = new PBEKeySpec(chars, salt, iterations, 128 * 8);
        SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        byte[] hash = skf.generateSecret(spec).getEncoded();
        return toHex(hash);
    }

最佳答案

128*8 是请求的 key 长度,根据 documentation .

keyLength - the to-be-derived key length.

尚不清楚它是否以位为单位,但确实如此。因此,您需要一个 1024 位长的 key (因为 128 * 8 = 1024)。

您将返回一个长度为 256 个字符的十六进制表示形式,每个字符都是一个十六进制数字。一个十六进制数字编码 4 位,因此您拥有一个 1024 位长的 key ,正如您所要求的那样。

关于java - PBKDF2WithHmacSHA1 令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24368807/

相关文章:

java - Spring Boot 应用程序在幕后如何与 mongodb 及其文档连接

Java:重复调用 paintAll 挂起程序

java - 使用 indexOf 和 substring 来计算数字

java - Android/java中调用类的私有(private)对象的方法

java - 使用 Maven 的来自 WSDL 的简单(独立)Java SOAP Web 服务客户端

Java Swing GUI Try/Catch block

java - INSERT 操作在使用 Java 的 SQLITE 中不起作用

java - 编辑文本等于

java - 如何在 jenkins 中为 Maven 3 项目单独执行 Sonar 工作

java - 将 3DES 存储在字符串中而不是 CipherOutputStream