2011-08-18 29 views
0

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

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

我查看了公共私钥加密和相关内容的常用方法。对于我的要求,我不需要像过多的标准东西那样的机制。我有点像寻找一个简单的选择。

感谢, Abishek

回答

0

我认为你在寻找什么是类似于一个time-synchronized one-time password

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

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

这种方法的明显风险或复杂性是保持两个系统时钟同步。如果您使用NTP或其他时间同步协议,那么您也必须保证这一点(否则您可能会面临重播攻击)。标准的计算机时钟很容易出现漂移(因此6秒的窗口),你也必须保证它们不被篡改。

(免责声明:我不是一个安全专家,所以不要想了一会儿说什么我已经概述的,是完全安全/安全的,因为是。)

+0

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

0

你也可以看看密钥交换协议如Diffie-Hellman。这里所交换的“密钥”是密码强的随机数发生器的种子,并且在这方面与真实的加密密钥几乎没有区别。

0

如果两个不同的系统正在生成相同的字符串,那么生成器通常不会具有密码安全性。一旦攻击者知道输入信息,她将能够生成相同的字符串,并且输入将是像Alistair所建议的那样的当前日期/时间。

这不是一个新问题,它已经被解决了。彼得指出你在Diffie-Hellman,这是一个标准的安全解决方案,用于在不安全的线路上建立共享密钥(即密钥)。

相关问题