【问题标题】:How secure is this method of password hashing and matching?这种密码散列和匹配方法的安全性如何?
【发布时间】:2015-11-07 07:33:00
【问题描述】:

我从一系列帖子和一些先验知识中获取信息来实现以下哈希算法。然而,有很多关于哪些实现是安全的和不安全的讨论。我的方法如何衡量?安全吗?

public static function sha512($token,$cost = 50000,$salt = null) {
        $salt = ($salt == null) ? (generateToken(32)) : ($salt);
        $salt = '$6$rounds=' . $cost . '$' . $salt . ' $';
        return crypt($token, $salt);
}

public static function sha512Equals($token,$hash) {
    return (crypt($token,$hash) == $hash);
}


public static function generateToken($length,$characterPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
    $token = '';
    $max = mb_strlen($characterPool);

    for ($i = 0;$i < $length;$i++){
        $token .= $characterPool[cryptorand(0,$max)];
    }

    return $token;
}

public static function cryptorand($min, $max) {
    $range = $max - $min;

    if ($range < 0) 
        return $min;

    $log = log($range, 2);
    $bytes = (int) ($log / 8) + 1; // length in bytes
    $bits = (int) $log + 1; // length in bits
    $filter = (int) (1 << $bits) - 1; // set all lower bits to 1

    do {
        $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
        $rnd = $rnd & $filter; // discard irrelevant bits
    } while ($rnd >= $range);

    return $min + $rnd;
}

那么这种方法安全吗? PHP 中是否有更安全的方法用于散列令牌并稍后与令牌匹配?非常感谢任何批评。

【问题讨论】:

  • 这是给瑞士银行的,哈哈。这已经足够了。
  • @MubinKhalid 也许......不,但很多信息都存储在用户帐户中,现在有很多简单的方法来散列密码,我想我不妨花一两个小时来确保我以最好的方式做到这一点。
  • 在 PHP 中,您应该简单地使用 password_hash()password_verify() 函数,因为它们实现了所有最佳实践。顺便说一句,cryptorand() 函数来自哪里,可以将 0..count 作为参数传递还是应该是 0..count-1?
  • @martinstoeckli 使用内置功能的建议是可以的,但cryptorand() 似乎已包含在问题的来源中。

标签: php security hash cryptography passwords


【解决方案1】:

不,因为您最终信任 crypt,并且您没有在 sha512Equals 中使用时间常数比较。

也可能存在特定于平台的问题:openssl_random_pseudo_bytes 不必是加密安全的。我不知道你怎么知道crypt 也使用 SHA-512。

cryptorand 中的计算略有偏差(例如,$log 的值恰好位于字节边界上),但幸运的是 do/while 循环对其进行了检查。


请改用password_hashpassword_verify 功能。

【讨论】:

  • “鉴于 PHP 的安全状态,我不确定它们是否完全安全,但至少你可以责怪其他人”它们实际上和 crypt(3) 一样安全。如果您好奇,请向@ircmaxell 询问详细信息:)
  • 嗨@HurricaneDevelopment,这足以回答这个问题吗?
  • @HurricaneDevelopment 我会接受 Maarten 的回答。它是正确的,不包含任何事实错误。 (我只是在回应他关于不确定它们是否完全安全的括号声明。)
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2016-09-20
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多