如何使用密码的哈希来加密

时间:2014-01-31 20:03:37

标签: java hash key encryption

所以基本上。 我想使用密码的哈希来加密一个主密钥。 目前我使用的代码就是这个

try {
        //Conservazione delle chiavi!
        //Secure PRNG
        SecureRandom m = SecureRandom.getInstance("SHA1PRNG");
        //Secure HASH
        MessageDigest hash = MessageDigest.getInstance("SHA-1");
        //KeyGenerator 
        KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
        keyGenerator.init(m);
        //Want to obtain a random masterkey that need to encrypt
        Key key = keyGenerator.generateKey();
        //Get DES cipher
        Cipher cipher = Cipher.getInstance("DES");
        //AND NOW?
                    cipher.init(Cipher.ENCRYPT_MODE, KEY); // THAT's the problem.



    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

密钥是我的密码短语。
像hash.digest(passphrase.getBytes());
 其中passpharse是一个简单的字符串。
任何建议如何使用哈希作为关键?
我应该使用密码的哈希来启动keyGenerator吗?

2 个答案:

答案 0 :(得分:1)

直接回答您的问题是使用DESKeySpecKeyFactory使用算法字符串"DES"作为getInstance(String)方法(就像您对{{1}所做的那样所以你从包含哈希的字节数组的前面(最左边)部分包装适当数量的字节,将它包装在KeyGenerator中并使用DESKeySpec方法从中创建一个键

间接地,您不应再使用SecretKeyFactory.generateSecret()。而是研究基于密码的加密,AES,CBC和密钥包装。在升级之前,请确保不要在生产环境中使用上述代码。

答案 1 :(得分:0)

这就是我的解决方法

SecureRandom m = SecureRandom.getInstance("SHA1PRNG");
//Secure Hash
MessageDigest hash = MessageDigest.getInstance("SHA-1");
//get a KeyGenerator DES init with a PRNG
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
keyGenerator.init(m);
//get Masterkey
Key masterkey = keyGenerator.generateKey();
//Get a DES cipger
Cipher cipher = Cipher.getInstance("DES");
//AND HERE HOW I RESOLVED!
SecretKeySpec secretKeySpec = new SecretKeySpec(Arrays.copyOf(hash.digest(passphrase.getBytes()), 8), "DES");

我使用SecretKeySpec来获取我的密钥。但是因为我的hash.digest(密码)太长了,我只需要复制前8个字节(因为DES密钥长度为64位)。