【发布时间】:2011-08-18 04:25:58
【问题描述】:
我正在寻找是否有可能在两个不同的 Java 代码中生成两个相同的字母数字字符串。这是为了客户端和服务器之间的安全通信。
或者有其他方法可以做到这一点吗?
我查看了公钥加密和相关内容的常用方法。对于我的要求,我不需要这样一种机制,因为它的标准东西太多了。我正在寻找一个像这样的简单替代方案。
谢谢, 阿比舍克
【问题讨论】:
我正在寻找是否有可能在两个不同的 Java 代码中生成两个相同的字母数字字符串。这是为了客户端和服务器之间的安全通信。
或者有其他方法可以做到这一点吗?
我查看了公钥加密和相关内容的常用方法。对于我的要求,我不需要这样一种机制,因为它的标准东西太多了。我正在寻找一个像这样的简单替代方案。
谢谢, 阿比舍克
【问题讨论】:
我认为您要查找的内容类似于 time-synchronized one-time password。
执行此操作的一种简单方法是使用系统时间,四舍五入到最接近的,例如,6 秒“脉冲”作为加密安全随机数生成器的种子(Java 提供 SecureRandomFWIW)。然后,连同预先共享的“秘密”一起通过单向加密哈希(例如 SHA256)生成您的字母数字(十六进制或 base64)字符串。
如果您不需要显示/传递实际字符串,那么我想您可以跳过哈希步骤,只需使用共享密钥和同步时间作为应用于通信流的密码的 IV + 密钥两端。
这种方法的明显风险或复杂性在于使两个系统时钟保持同步。如果您使用 NTP 或其他时间同步协议,那么您也必须保护它(否则您可能会受到重放攻击)。标准计算机时钟容易漂移(因此有 6 秒的窗口),您还必须保护它们不被篡改。
(免责声明:我不是安全专家,所以暂时不要认为我所概述的内容是完全安全的。)
【讨论】:
如果两个不同的系统正在生成相同的字符串,那么生成器通常不会是加密安全的。一旦攻击者知道输入,她将能够生成相同的字符串,并且输入将是 Alistair 建议的当前日期/时间之类的内容。
这不是一个新问题,它已经解决了。 Peter 已向您指出 Diffie-Hellman,这是通过不安全线路建立共享密钥(即密钥)的标准安全解决方案。
【讨论】: