【问题标题】:Added whitespaces to encrpyted password?在加密密码中添加空格?
【发布时间】:2012-09-17 01:02:11
【问题描述】:

我在我的登录模型中实现了用于解密/加密用户密码的功能(在加密版本中存储在 cookie 中)。一切正常,除非我重新启动浏览器并尝试通过 cookie 使用密码登录。

解析器告诉我这是错误的密码,即使当我回显它时我可以看到它是正确的密码。因此我尝试了一个“strlen”来查看密码有多少个字符,它显示为 32(!)。我唯一能想到的是(在这种情况下)添加了 28 个空格,这无法通过回声看到。

如果有人能告诉我发生了什么以及如何解决它,我将不胜感激?

function decrypt($encrypedText) {
    $key = "The secret key is";
    $decryptedText = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($encrypedText), MCRYPT_MODE_ECB);

    echo $decryptedText;            //  "abcd" <- what I put in
    echo strlen($decryptedText);    //  32 (?)

    return $decryptedText;
}

【问题讨论】:

  • 你在哪里定义$decryptedText?在函数中没有赋值,既不是参数也不是全局的。
  • Everythingare尝试to做是wrong.请停止你正在做的事情并了解正确的密码存储和处理。
  • “在解密版本中存储在 cookie 中” - 我非常希望这是一个错字。
  • @holyredbeard 以不同的方式了解它们。这就像通过射击自己的脸来了解枪支一样。
  • 一个建议:下载这个库来处理你的 PHP 密码:github.com/ircmaxell/password_compat——这个库将被嵌入到 PHP 的下一个版本(5.5)中,作为处理密码加密的标准推荐方法。同时,使用可下载的版本,而不是尝试编写密码加密处理。 (另请参阅h-online.com/open/news/item/… 参考)

标签: php string int whitespace mcrypt


【解决方案1】:

这是因为 32 字节是 Rijndael 256 的块大小(即 32 = 256 / 8),解密后的数据用 '\0' 填充以匹配该长度。

要更正此问题,您可以像这样删除这些字符:

return rtrim($decryptedText, '\0');

【讨论】:

  • 我最初认为它有效,但我的测试表明结果仍然包含 32 个字符。 ://
  • @holyredbeard 太奇怪了,你能对其执行 bin2hex() 以确定添加了哪些字符吗?
【解决方案2】:

要删除空格,请使用 php trim() 函数

$password=trim($_COOKIE("value"));

它将删除开头和结尾的空格

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多