【问题标题】:Generate two same random alpha-numeric strings in different java programs在不同的java程序中生成两个相同的随机字母数字字符串
【发布时间】:2011-08-18 04:25:58
【问题描述】:

我正在寻找是否有可能在两个不同的 Java 代码中生成两个相同的字母数字字符串。这是为了客户端和服务器之间的安全通信。

或者有其他方法可以做到这一点吗?

我查看了公钥加密和相关内容的常用方法。对于我的要求,我不需要这样一种机制,因为它的标准东西太多了。我正在寻找一个像这样的简单替代方案。

谢谢, 阿比舍克

【问题讨论】:

    标签: java security random


    【解决方案1】:

    我认为您要查找的内容类似于 time-synchronized one-time password

    执行此操作的一种简单方法是使用系统时间,四舍五入到最接近的,例如,6 秒“脉冲”作为加密安全随机数生成器的种子(Java 提供 SecureRandomFWIW)。然后,连同预先共享的“秘密”一起通过单向加密哈希(例如 SHA256)生成您的字母数字(十六进制或 base64)字符串。

    如果您不需要显示/传递实际字符串,那么我想您可以跳过哈希步骤,只需使用共享密钥和同步时间作为应用于通信流的密码的 IV + 密钥两端。

    这种方法的明显风险或复杂性在于使两个系统时钟保持同步。如果您使用 NTP 或其他时间同步协议,那么您也必须保护它(否则您可能会受到重放攻击)。标准计算机时钟容易漂移(因此有 6 秒的窗口),您还必须保护它们不被篡改。

    (免责声明:我不是安全专家,所以暂时不要认为我所概述的内容是完全安全的。)

    【讨论】:

    • 刚刚意识到即使只是系统时间和“秘密”也应该足以生成合理安全的加密哈希(不需要随机数生成)。此外,另一个可能的风险是,如果知道“秘密”,系统时间(四舍五入)可以相对容易地猜出,从而允许窃听者破解密码。不过,我不想在接受后编辑我的原始答案。
    【解决方案2】:

    如果两个不同的系统正在生成相同的字符串,那么生成器通常不会是加密安全的。一旦攻击者知道输入,她将能够生成相同的字符串,并且输入将是 Alistair 建议的当前日期/时间之类的内容。

    这不是一个新问题,它已经解决了。 Peter 已向您指出 Diffie-Hellman,这是通过不安全线路建立共享密钥(即密钥)的标准安全解决方案。

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2021-04-05
      • 2011-08-18
      相关资源
      最近更新 更多