【问题标题】:md5 doesnt work with certain characters [closed]md5不适用于某些字符[关闭]
【发布时间】:2014-07-31 22:21:51
【问题描述】:

我已经为我的网站设置了一个登录/注册脚本,并且我正在使用 md5 来加密我的密码,我只是设置了一个更改密码部分,但是我注意到我只能在密码包含字母数字时才能更改我的密码。例如,如果我的旧密码是 stack123 并且我将其更改为 overflow123 它将完美地工作。但是,如果我将它从堆栈 123 更改为堆栈!它不会,我猜这是因为在这种情况下有感叹号。谁能向我解释为什么会这样?

【问题讨论】:

  • 如果您不显示您的代码,没有人可以帮助您。
  • MD5 不安全。安全性很难;不要重新发明轮子。您必须使用现有的、经过验证的身份验证系统。
  • 你有什么推荐的 SLaks 吗?
  • 那么,如果你这样做md5('stack!'),你会得到什么?它会抛出错误吗? md5 当然不会....更有可能您的脚本中的其他地方有一些代码将密码字段限制为仅限字母数字(这是非常糟糕的做法)
  • 贝克,你说得对,我的密码字段仅限于字母数字,但从我收到的 cmets 和答案中,我将使用现有的身份验证系统,尽管如此,感谢您,帮助让事情变得清晰。跨度>

标签: php login web md5 change-password


【解决方案1】:

不要使用 MD5。你应该使用hash_hmac() 或者更好的新PHP Hashing API(如果你至少有PHP 5.5)。为了使密码更安全,使用随机生成的,为每个用户使用不同的盐(它只是一个充满随机字符的字符串)并将其与密码一起保存在数据库中。

这是一个生成随机字符串的函数($length决定返回字符串的长度):

function generate($length) {
    $dummy = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z'));
    shuffle($dummy);
    return substr(implode('', $dummy), 0, $length);
}

这是 PHP Hashing API 的代码 sn-p:

function my_password_hash($salt, $password) {
    $phpapi_options = array("algo" => PASSWORD_BCRYPT, "salt" => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), "cost" => 11);
    return password_hash(sha1($salt.$password), $phpapi_options['algo'], $phpapi_options);
}

function my_password_verify($salt, $password, $hash) {
    return password_verify(sha1($salt.$password), $hash);
}

my_password_hash() 为给定的盐和密码生成哈希。 my_password_verify() 使用您存储在数据库中的哈希验证给定的密码(用户输入)和盐(来自数据库)。

这是一个带有 hash_hmac() 的代码 sn-p:

function my_password_hash($salt, $password) {
    $hash_key = ""; //define a 10 characters long random generated string here (it has to be always the same)
    if(empty($hash_key)) {
        die('You must enter a valid hash key.');
    }

    return hash_hmac("sha512", sha1($salt.$password), $hash_key);
}

function my_password_verify($salt, $password, $hash) {
    if($hash == my_password_hash($salt, $password)) {
        return true;
    } else {
        return false;
    }
}

我希望这对您有所帮助,如果没有或者您有任何问题,请尽管提问。

【讨论】:

  • 感谢您提供的信息,但我对哈希和盐不是很熟悉,所以我四处搜索并找到了 usercake。 usercake.com/ 你会推荐使用他们引用的“盐和 SHA1 哈希来加密密码。盐的长度为 25 个字符。这可以增加到 32 个字符。在模型/中找到 generateHash() 函数funcs.php 来修改它。”你会推荐这个
  • 好吧 sha1() 比 md5() 好,但互联网上出现 sha1 彩虹表只是时间问题。只需谷歌“md5 彩虹表”即可获得一些 MD5。您应该使用我上面所说的功能之一。上面这些的使用实际上与使用 sha1() 和 usercake 中的盐相同。
  • 你到底为什么要这样滥用密码功能?没有理由生成自己的盐,也没有理由想先sha1字符串
  • 另外,您应该使用PASSWORD_DEFAULT 作为算法,以使您的代码和散列更加面向未来,因为它会在将来实施时自动使用更新/更强的算法。
  • “它确实使散列更强” 那如何使散列更强?你认为sha1 对你的熵有什么影响?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多