在PHP中加密非常短的字符串的最佳方法是什么?

时间:2020-03-06 14:26:29  来源:igfitidea点击:

我想对字符串进行加密,该字符串可能只能是大约三个或者四个字符,但可以运行到大约二十个字符。哈希函数(md5,sha1,crypt等)不适合,因为我也希望能够解密信息。 mcrypt扩展具有许多令人生畏的可能性。

是否有人对安全加密短字符串的最佳方法有任何想法?为什么?是否有人链接到任何材料,将随意的程序员介绍给实际的加密方案?

解决方案

任何人都可以解密它有关系吗?如果我们只是想稍微混淆一下,请使用ROT13. 这是老学校。

我猜,像Blowfish这样的任何单向加密算法都可以。河豚又快又开。我们可以通过crypt()函数使用Blowfish。 AFAIK没有加密算法在小字符串上效果特别好。但是要注意的一件事是,强行强制使用如此小的字符串将非常容易。也许我们应该将字符串与"秘密"盐值一起加密,以提高安全性。

我喜欢将GnuPG用于需要在服务器上加密,然后可能在该服务器或者另一台服务器上解密的任何事物(通常是我的情况)。由于在我的情况下加密服务器没有解密数据的密钥,因此可以提供更高级别的安全性。它还允许更轻松的手动解密。有一些很好的包装器可用于各种语言(另一个优势),PHP的一种是GnuPGP PHP类。

如果要在应用程序中加密和解密数据,则很可能要使用对称密钥密码。 AES是最佳选择,它是NSA认证的对称块加密算法,用于保护机密数据。在www.phpaes.com上有一个纯PHP实现。

对于使用,听起来像AES128就足够了。我们可能希望将CBC模式与随机初始化向量一起使用,否则相同的数据将始终产生相同的密文。

选择正确的加密算法是一个很好的第一步,但是安全系统有很多因素很难解决,例如密钥管理。这里有很多资源,例如Br​​uce Schneier的Applied Cryptography和Ross Anderson的Security Engineering(可免费在线获得)。

默认情况下,mcrypt被链接到大多数PHP版本中。它包含我们可能需要的所有原语。如果不了解有关加密内容,威胁模型等的更多信息,则很难就要使用的算法,操作模式等提出具体建议。

我可以肯定地说一句话:对于短文本字符串,必须使用唯一的随机初始化向量比以往任何时候都更为重要。否则,有人对加密数据发起各种攻击是不重要的。

我同意Chris Kite只是使用AES 128,这已经足够了。

我不确定我们所处的环境,但我想我们正在以某种方式通过互联网传输数据。

不要使用ECB,这对于相同的纯文本总是会产生相同的结果。

CBC模式是必经之路,不要忘记随机初始化向量。该向量必须与密文进行通信,并且可以以明文形式发送。

关于数据,由于AES是块密码,因此结果始终是块大小的倍数。如果不想让观察者知道数据是短还是长,请添加一些填充以将其扩展到最大预期大小。

我强烈推荐克里斯·凯特(Chris Kite)的建议。不知道我们在做什么,为什么做以及我们预期需要防御AES-128的威胁就足够了。使用对称加密的功能对于独立的应用程序非常有用,它将成为数据的解密器和加密器。正如Chris Kite和Arachnid所说,由于数据量较小,建议我们填充数据并使用随机的初始化向量。

Update: As for why....  if the data is small enough, and the IV can be predicted, it's possible to brute force the plain-text by generating cipher-text for every combination of plain-text with the known IV and matching it up to the captured cipher-text.  In short, this is how rainbow tables work.

现在,如果我们要在一台服务器上加密而在另一台服务器上解密,则可以使用pdavis的建议。通过使用非对称方法,我们可以将加密密钥与解密密钥分开。这样,如果加密数据的服务器受到威胁,攻击者仍然无法解密数据。

如果可以,它社区进一步了解加密用例。正如我上面提到的,在评估安全控制时,正确理解合理的威胁是关键。