【问题标题】:How to use Hash of a passphares to encrypt如何使用密码的哈希进行加密
【发布时间】:2014-01-31 20:03:36
【问题描述】:

基本上是这样。 我想使用密码的哈希来加密主密钥。 目前我使用的代码是这样的

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());
其中密码是一个简单的字符串。
关于如何使用散列作为键的任何建议?
我应该使用密码的哈希来初始化 keyGenerator 吗?

【问题讨论】:

  • 通过代码中的 cmets 阅读您的问题有点困难。你能在问题的散文中提出一个明确的问题吗?

标签: java hash key encryption


【解决方案1】:

您的问题的直接答案是使用 DESKeySpecKeyFactory 算法字符串 "DES" 用于 getInstance(String) 方法(就像您为您的 KeyGenerator 所做的那样。所以您包装了适量的从包含哈希的字节数组的前面(最左边)部分开始,将其包装在 DESKeySpec 中,并使用 SecretKeyFactory.generateSecret() 方法从中创建密钥。

间接地,你不应该再使用"DES"。而是研究基于密码的加密、AES、CBC 和密钥包装。确保在升级之前不要在生产环境中使用上面的代码。

【讨论】:

  • 我知道 des 协议不再安全(可能三倍 des 应该更好),但我只需要了解对称密码背后的机制
  • @AntonioCalì DES 作为用于练习的密码很好。请注意,尽管 DES 具有相当大的特性集,例如 DES 奇偶校验位。因此,您不能使用随机(看起来)字节块作为密钥。这就是为什么你应该在这里真正使用SecretKeyFactory。例如,AES 可以直接使用SecretKeySpec 作为SecretKey。奇偶校验位还将密钥空间减少到 56 位。在现代加密中,我们使用 AES 不仅是因为它更强大,而且使用起来更快、更容易。
【解决方案2】:

我就是这样解决的

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(passphrase) 太长,我只需要复制前 8 个字节(因为 DES 密钥是 64 位长)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-08-02
    • 2012-04-01
    • 2019-04-21
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多