我们有一个Java中进行Rijndael开发的需求。
您有哪些文章、库等推荐可以帮助我们?
请给出关于密钥库维护以及如何安全存储密钥的任何指导意见。
编辑:
它需要是开源的。基本上,只需要使用Rijndael对数据进行标准的加密/解密。
我们有一个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.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
至于安全密钥存储,通常的方法是使用加密哈希函数从用户输入(密码短语)派生出一个加密密钥,并使用派生密钥来加密密钥链。或者,如果您只需要一个密钥,可以直接使用派生密钥。
始终记住,系统的安全性与所使用的哈希函数的强度直接相关。使用具有密码学安全性的哈希函数,如果可能的话,使用盐,并进行多次哈希(例如数百次)。
话虽如此,这个问题非常模糊。
javax.crypto
使用了一个非常优化的 AES 版本,并且速度相当快。 - tony9099