代码有一些问题。首先,您确实应该使用密钥生成器来生成秘密密钥。对于某些算法,仅直接使用一些文本可能会起作用,但是其他算法的键较弱,因此需要进行测试。
即使您要进行基于密码的加密,也应该通过密钥派生算法来运行密码,以产生密钥,如我)对您已经提到的问题的回答所示。
另外,您不应使用的no-arg
getBytes()方法
String。这取决于平台。如果您要编码的所有字符串仅包含来自US-
ASCII字符集的字符,请通过明确指定该编码来使其清楚。否则,如果电话和服务器平台使用不同的字符编码,则密钥和IV的结果将不同。
对于CBC模式,最好对您发送的每条消息使用新的IV。通常,CBC IV是随机生成的。CFB和OFB等其他模式 要求 每条消息 都
具有唯一的IV。IV通常与密文一起发送-IV不需要保密,但是如果使用可预测的IV,许多算法都会中断。
服务器不需要直接从电话获取机密或IV。您 可以 使用密钥(或从中派生密钥的密码)配置服务器,但是在许多应用程序中,这将是一个糟糕的设计。
例如,如果要将应用程序部署到多人的电话中,那么对于他们来说使用相同的密钥并不是一个好主意。一个恶意用户可以找回密钥并破坏每个人的系统。
更好的方法是在电话上生成新的秘密密钥,并使用密钥协商算法与服务器交换密钥。为此,可以使用Diffie-
Hellman密钥协议,也可以使用RSA加密秘密密钥并将其发送到服务器。
更新:
只要服务器的公用密钥嵌入到应用程序中,就无需从服务器到电话的初始消息,就可以在“短暂静态”模式(也不太希望使用“静态-静态”模式)中的Diffie-
Hellman。 。
服务器公用密钥不会像在电话中嵌入公用密钥那样带来相同的风险。由于它是公共密钥,因此威胁可能是攻击者将其伸手(或远程入侵)电话并用伪造的密钥替换真实的公共密钥,从而使他可以模拟服务器。
可以使用静态-
静态模式,但实际上更复杂,安全性稍差。每个电话都需要自己唯一的密钥对,否则您将陷入秘密密钥问题。至少服务器不需要跟踪哪个手机具有哪个密钥(假设在应用程序级别上有某种身份验证机制,例如密码)。
我不知道手机有多快。在我的桌面上,生成临时密钥对大约需要1/3秒。生成Diffie-Hellman参数非常缓慢;您肯定要重复使用服务器密钥中的参数。



