从PBKDF2 HMac SHA1以人类可读形式哈希?

时间:2016-11-20 14:11:20

标签: java pbkdf2

我想知道使用Oracle提供的PBKDF2WithHmacSHA1哈希算法是否可以提供人类可读形式的密钥。

我尝试了以下代码,并且哈希输出有一些非人类可读的字符。

public class PBKDF2HMacSHA1Sandbox {
     public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException 
        {
            String  originalPassword = "mypassword?2046?!";
            String generatedSecuredPasswordHash = generateStorngPasswordHash(originalPassword);
            System.out.println(generatedSecuredPasswordHash);
        }
        private static String generateStorngPasswordHash(String password) throws NoSuchAlgorithmException, InvalidKeySpecException
        {
            int iterations = 10000;
            char[] chars = password.toCharArray();
            byte[] salt = getSalt();

            PBEKeySpec spec = new PBEKeySpec(chars, salt, iterations, 46);
            SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
            byte[] hash = skf.generateSecret(spec).getEncoded();
            return iterations + ":" + toHex(salt) + ":" + new String(hash);
        }

        private static byte[] getSalt() throws NoSuchAlgorithmException
        {
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
            byte[] salt = new byte[16];
            sr.nextBytes(salt);
            return salt;
        }

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

0 个答案:

没有答案