Rijndael在Java中的支持

我们需要在Java中进行一些Rijndael开发。

对文章,图书馆等有什么建议可以帮助我们吗?

任何指向密钥库维护的指针以及如何安全地存储密钥?

编辑:

它需要是开源的。 从本质上讲,它只是使用Rijndael对数据进行标准加密/解密。

Java包含开箱即用的AES。 Rijndael是AES。 您不需要任何外部库。 你只需要这样的东西:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post byte[] iv = null ; //Ditto byte[] plaintext = null; //Whatever you want to encrypt/decrypt Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); //You can use ENCRYPT_MODE or DECRYPT_MODE cipher.calling init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv)); byte[] ciphertext = cipher.doFinal(plaintext); 

就是这样,加密/解密。 如果您正在处理大量数据,那么最好读取16字节倍数的块并调用update而不是doFinal(您只需在最后一个块上调用doFinal)。

对于一个伟大的免费图书馆,我强烈推荐BouncyCastle。 它积极维护,高质量,并有一系列很好的代码示例。 对于参考文档,您将不得不更多地依赖于一般的JCE文档。

我不能说我们用什么库来满足FIPS认证要求。 但是CryptoJ还有其他更便宜的替代方案。

一般情况下,我建议为使用对称密码(如Rijndael)加密的每条消息生成一个新密钥,然后使用RSA等非对称算法加密该密钥。 这些私钥可以存储在受密码保护的基于软件的密钥存储区中,如PKCS#12或Java的“JKS”,或者为了更好的安全性,可以存储在“智能卡”硬件令牌或其他加密硬件模块上。

正如我公司最近发现的那样,AES并不完全是Rijndael。 AES具有密钥必须为128,192或256位的限制 – 但是,Rijndael也允许160和224的密钥。

如上面的erickson所示,BouncyCastle提供了一个Rijndael对象,它支持额外的密钥长度:128/160/192/224/256位。 具体来说,看看轻量级API。

Gnu-crypto是另一个开源库 – 但是,它也不支持160和224位密钥。

所以,如果你是专门寻找完整的Rijndael支持,那么BouncyCastle是迄今为止我发现的唯一一个。

javax.crypto有AES支持: http : //java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

对于安全密钥存储,通常的方法是使用加密散列函数从用户输入(密码短语)导出加密密钥,并使用导出密钥加密密钥链。 或者,如果您只需要一个密钥,则可以使用派生密钥本身。

始终牢记系统的安全性与所使用的哈希函数的强度直接相关。 使用加密安全散列函数,如果可能,使用salt,并且多次散列(例如,数百次)。

话虽如此,问题非常模糊。