AES自定义密码密钥

时间:2017-05-28 04:27:46

标签: java encryption

我正在尝试实施AES自定义密码加密,并希望了解以下代码。

我不太明白为什么需要指定密钥大小256" PBEKeySpec(密码,盐,65536,256)",当我使用" PBKDF2WithHmacSHA256& #34;假设将SecretKey生成为256位。

使用我的密码+ salt生成密钥后,为什么我需要将它与SecretKeySpec关联为AES算法。

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

1 个答案:

答案 0 :(得分:4)

  

为什么需要指定密钥大小256

PBKDF2是一种灵活的基于密码的密钥派生功能。它使用具有多次迭代的底层哈希函数。它可以输出您想要的任何大小的密钥。即使在生成AES-128密钥时也常常使用SHA-256,因为不知道SHA-256是否被破坏,与其他散列函数(如MD5和SHA-512)相比,它相对较慢(仅在x64上)。缓慢是PBKDF的一个重要因素,因为它会在攻击者试图强制密码时直接影响攻击者。当然,您也有可调整的迭代次数。

此外,PBKDF2可以输出比基础哈希函数输出大小更多的密钥材料。例如,通常要求PBKDF2的输出包括IV。在您的情况下,输出应该是384位长。

通常,建议不要从PBKDF2请求多个基础哈希函数。如果你想得到IV,你应该use SHA-512。只要为每次加密随机生成盐并将其与密文一起存储,这应该足以实现语义安全性。

所以,为了回答你的问题,PBKDF2不知道你想如何使用输出。你对此负责。你必须知道你在做什么。有一百万种不同的方法可以解决PBKDF加密问题的部分。

  

为什么我需要将它与SecretKeySpec关联为AES算法。

如果要使用Cipher实例使用AES加密某些内容,则需要传入一个java.security.Key对象,该对象将在运行时解析为AES。 Key#getAlgorithm()方法用于此目的。如果您在创建"AES"时未指定SecretKeySpec,则会获得InvalidKeyException