PBKDF2WithHmacSHA1令人困惑

时间:2014-06-23 14:43:34

标签: java

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

这是我从此代码返回的结果:

67a0759ac6266ca2156555426aae10b18c34b436ea036247e6c0e16cd8d4199b9df508c32cd14e50a533ac00c071888cb8167982d9bf22a89ccd1c02a9d9c76d4e5fb5c3be91711a444a3b453c54790d5b540d7f3d0ef5798cf6a08e5acaf1b0fb445e174befd2e5b97978534aa7c22c4e404503e40f06f6832fe4a5843c9b01

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

2 个答案:

答案 0 :(得分:2)

128 * 8是请求的密钥长度,根据documentation

  

keyLength - 要派生的密钥长度。

目前尚不清楚它是否有点,但确实如此。所以你要的是一个1024位长的密钥(因为128 * 8 = 1024)。

你得到一个十六进制表示,长度为256 个字符,每个都是一个十六进制数字。一个十六进制数字编码4位,所以你有一个1024位长的密钥,就像你要求的那样。

答案 1 :(得分:0)

第4个参数是密钥长度

PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)

构造函数,它接受密码,salt,迭代计数和将要派生的密钥长度,以生成可变密钥大小的PBE密码的PBEKey。