【问题标题】:How safe is mcrypt encodingmcrypt 编码有多安全
【发布时间】:2017-09-12 23:34:45
【问题描述】:

我有两个函数和一个随机生成的密钥:

function encode ($a) {
    $key = "7HLgdzXyaTaZuTss6xayLk3qLTJ2jsRLgPnMzpNwhwnEZsnHUfHxfYW5r3sQcZsC";
    $aEncoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,md5($key),$a,MCRYPT_MODE_CBC,md5(md5($key))));
    return $aEncoded;
}

function decode ($a) {
    $key = "7HLgdzXyaTaZuTss6xayLk3qLTJ2jsRLgPnMzpNwhwnEZsnHUfHxfYW5r3sQcZsC";
    $aDecoded = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256,md5($key),base64_decode($a),MCRYPT_MODE_CBC,md5(md5($key))),"\0");
    return $aDecoded;
}

当用户登录时,一些私人数据和当前时间戳将被编码并保存为会话 cookie。同样的时间戳也保存在 mysql 数据库中。现在我想在用户向 ws 服务器发送数据包时对其进行身份验证。将密钥发送到服务器,在那里对其进行解码并检查密钥的时间戳是否与保存在 mysql 数据库中的最后一次登录匹配,是否安全? (我还会检查密钥是否旧,因此如果有人不再登录,则密钥将在 6 小时后不再起作用。

编辑:用户将无法看到这些功能,密钥将在登录 php 文件中生成!

【问题讨论】:

  • 最好不要使用mcrypt,它是废弃软件,多年未更新,不支持标准PKCS#7(née PKCS#5)填充,只有非标准空填充可以'甚至不能与二进制数据一起使用。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。不推荐使用的 mcrypt-extension 将在 PHP 7.2 中删除。而是考虑使用defuseRNCryptor,它们提供了完整的解决方案并且正在维护中并且是正确的。
  • 您指定MCRYPT_RIJNDAEL_256,这可能不会给您您的想法。 256 指的是块大小,而不是密钥大小。通常,128 位的块大小被指定为与 AES 兼容。
  • 对于CBC模式使用随机IV,只需在加密数据前加上IV用于解密即可,不需要保密。

标签: php mysql decode encode mcrypt


【解决方案1】:

使用 base64 为登录信息编码字符串不会提高安全性。

为了实现安全的方法,我建议使用密钥绑定加密,就像 OpenSSL

PHP 也支持它,你可以在你的 php 程序中定义一个密钥并用它加密你的 cookie,我还建议使用动态密钥(即 6 位日期 170417),以防你需要 cookie 完全不可发现!

看看openssl_encryptopenssl_get_cipher_method()

【讨论】:

  • 谢谢!首先,如果有人破解了密钥并能够通过另一个用户的密钥进行身份验证,他就不会造成任何损害。 (这就是为什么我不需要高级别的安全性)。我从未听说过 openssl,只是读到您应该始终使用 openssl 而不是 base64。真的吗?或者base64有什么优势?
  • Base64没有任何安全性它不是一种加密算法;它不是加密算法。这是一种用文本表示二进制数据的方法,因此可以很容易地跨某些协议进行传输。 OP 代码的安全性完全依赖于mcrypt_encrypt()mcrypt_decrypt()
  • 是的,我的意思是,你还是明白我的问题吧?
  • @SimonPannek,我想我现在知道了。但是您最初询问 base64 有多安全,而这就是该用户的回答(错误地)。 Stack Overflow 问题和答案旨在为未来的其他用户以及直接提问和回答问题的用户提供资源。感谢您更新您的问题;如果 Zich 更新此答案以删除关于 base64 是“具有中级安全性的方法”的部分,我将删除我的反对票。
  • @Zich,你 100% 错了。 Base64根本没有提供任何安全性它甚至几乎没有混淆;即使它做到了wouldn't provide meaningful security。从 base64 编码字符串中获取数据唯一需要做的就是对它进行 base64 解码。该功能是built into virtually 每种语言。
猜你喜欢
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多