所以基本上。 我想使用密码的哈希来加密一个主密钥。 目前我使用的代码就是这个
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吗?
答案 0 :(得分:1)
直接回答您的问题是使用DESKeySpec
和KeyFactory
使用算法字符串"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位)。