创新/安全的方法来根据Java中的共享秘密保护数据



我一直在尝试Java中的一些基本加密技术(我喜欢的编程语言),并具有一个简单的示例,该示例使用模块化指数来生成两个客户端对之间的共享秘密。

但是,考虑到一个共享的秘密,使用使用使用此秘密来加密/解密或争夺/杂乱无章的数据,这些秘密是什么

例如,如果我有字符串:

"So long, and thanks for all the fish"

和共享秘密(BigInteger):

1110278255331388386297296974141977

如何以允许客户相互了解的方式通过电线发送字符串,同时确保没有共享的秘密,没有中间人可以解释它?

我不是要求完成的实现,只是可以使用的算法/技术的想法或参考。我还避免依靠现有程序或API(例如公共/私钥),因为这只是用于我自己的教育目的的附带项目。

有一种标准的方式来做您追求的事情,这称为基于密码的键推导。您需要使用安全的对称加密算法。当然,您可以选择不对称的RSA,但是有了共同的秘密,这是多余的。

但是,您不想直接使用共享的秘密。

  1. 您的共同秘密可能具有不适当的大小作为钥匙。例如,AES作为一个不错的选择,接受128位和256位键,共享秘密可能不是一个很好的匹配。
  2. 您选择的对称算法的关键应该足够安全,这意味着它应该具有安全的随机性水平,您的共同秘密可能缺乏。

正是诸如PBKDF2(基于密码的键推导功能2)之类的算法。PBKDF2已经在标准Java中实现,您可以使用它。它基于"密码"生成具有任意大小的安全键,在这种情况下,这只是共享的秘密。这些算法家族具有迭代参数,该参数表明应用了键函数来得出键的次数。确保将其设置为高数量。

我应该注意,在这种情况下,安全性(传输数据的机密性和完整性)依赖于您的共享秘密实际上是秘密。我不知道您是如何生成它的,但是您需要确保该过程是安全的。Diffie-Hellman钥匙交换是一个很好的例子。如果您对此不熟悉,我建议您看看,看看该过程是安全的。

正如评论中已经说明的那样,您不需要(也不应该)在加密术中进行创新以进行实际应用。您会发现所需的任何已实施并证明安全的东西。

拿我的最后一句话。

最新更新