java – 比播种SecureRandom更好的创建AES密钥的方法
我需要将加密数据从
Java客户端发送到C#服务器.现在我正在学习如何使用AES(要求)加密数据.按照这个接受的答案
android encryption/decryption with AES,我正在做以下事情:
byte[] keyStart = "qweroiwejrwoejlsifeoisrn".getBytes(); // Random character string byte[] toEncrypt = myMessageString.getBytes(); keyGen = KeyGenerator.getInstance("AES"); sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(keyStart); keyGen.init(128,sr); SecretKey secretKey = keyGen.generateKey(); byte[] secretKeyByte = secretKey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(secretKeyByte,"AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE,skeySpec); cipher.doFinal(toEncrypt); 由于该算法使用keyStart使用SecureRandom,我不确定这是否可以在C#中解码,甚至在没有SecureRandom的情况下在其他Java程序中解码. 这个加密/解密是否只需要知道keyStart的值,或者因为我使用的是SecureRandom,我还需要传递其他内容才能解密? 还有,有更好的方法来做这个还是这个好吗? 解决方法
不,你应该使用SecureRandom从静态数据中获取密钥的整个想法是相当糟糕的:
> SecureRandom的主要功能是生成随机值,它不应该用作密钥流的生成器; 已知使用“SHA1PRNG”作为密钥派生函数会在多个版本的Android上产生问题,并且可能在任何其他Java RE上失败. 那么你该怎么做呢? >使用新的SecureRandom()甚至更好的, 如果通过例如种子生成种子,则优选备选方案4.密钥协商算法,如Diffie-Hellman或ECDH. 请注意,对于选项3,PBKDF2,您最好只保留ASCII密码.这是因为Oracle的PBKDF2实现不使用UTF-8编码. 至于选项4,我帮助将所有优秀的KBKDF添加到Bouncy Castle libraries,因此如果您可以将Bouncy Castle添加到类路径和/或已安装的安全提供程序列表中,则无需自己实现KBKDF.目前最好的KBKDF可能是HKDF.如果您不能将Bouncy Castle添加到类路径中,那么您可能希望使用SHA-256输出的最左边字节而不是派生数据作为“穷人”KDF. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |