这有点矫枉过正吗?用于漩涡密码加密的动态盐加密

时间:2014-04-08 20:24:10

标签: php security encryption hash whirlpool

我认为在漩涡中进行密码加密时,我可能会产生一些过度的盐。

这就是盐生成代码一步步做的事情

  1. 生成长度为10的伪随机字符串,它具有以下可能的值:

    0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

  2. 大气噪声产生-2到123的真正随机数

  3. 此伪随机字符串和完全随机数与unix时间戳一起混洗。
  4. 然后使用md5加密此预盐。
  5. 这就是盐的生成,我也在漩涡中加密了整个事情

    hash( 'whirlpool',$salt.$password);
    

    我的代码中是否存在安全漏洞?我应该在加入之前或之后对值进行md5哈希处理吗?

    这是我要检查的代码......

    <?php
    function generateRandomString($length = 10) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, strlen($characters) - 1)];
        }
        return $randomString;
    }
    
    function get_true_random_number($min = 1, $max = 100) {
        $max = ((int) $max >= 1) ? (int) $max : 100;
        $min = ((int) $min < $max) ? (int) $min : 1;
        $options = array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER => false,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_ENCODING => '',
            CURLOPT_USERAGENT => 'PHP',
            CURLOPT_AUTOREFERER => true,
            CURLOPT_CONNECTTIMEOUT => 120,
            CURLOPT_TIMEOUT => 120,
            CURLOPT_MAXREDIRS => 10,
        );
    
        $ch = curl_init('http://www.random.org/integers/?num=1&min='
            . $min . '&max=' . $max . '&col=1&base=10&format=plain&rnd=new');
        curl_setopt_array($ch, $options);
        $content = curl_exec($ch);
        curl_close($ch);
    
        if(is_numeric($content)) {
            return trim($content);
        } else {
            return rand(-10,127); //INCASE RANDOM.ORG returns a server busy error
        }
    }
    
    function generateSalt() {
        $string = generateRandomString(10);
        $int = get_true_random_number(-2,123);
        $shuffled_mixture = str_shuffle(Time().$int.$string);
        return $salt = md5($shuffled_mixture);
    }
    
    echo generateSalt();
    ?>
    

    另外,盐应该多长时间?我个人并不认为散列它的其他类型的角色很重要,因为没有人粗暴地强迫整个,我不会想。这就是全部!提前致谢。此外,任何更好或更有效的方法都会有所帮助。

2 个答案:

答案 0 :(得分:1)

Miguel Ibarra Romero撰写了一篇与此特定主题相关的优秀文章:

Risks and Challenges of Password Hashing

他声称盐的长度应为64个字符,以防止暴力攻击。

在实施方面:我强烈建议不要使用您没有任何物理控制权的真随机数源。从其他人的网站获取随机数字,尽可能方便,但不是安全的做法。你不知道这些数字来自何处,它们是如何生成的,它们有多么偏颇,以及是否有你接收它们的记录的加密确定性。

答案 1 :(得分:0)

关于加密的一般准则:不要编写自己的加密!这包括创建自己的算法并实施公开同行评审的系统。要做到这一点太难了(即使是专家)。

从PHP 5.5开始,您应该使用非常简单且完善的API进行密码散列:password_hash() and password_verify()


现在关于您的实现和算法:

您担心密码哈希算法的错误方面。您使用的盐不必包含超高熵值,甚至可以以更简单的方式收集这些值(例如,如果您在Linux上,则从/dev/urandom读取32个字节)。

您应该担心的一个方面是强制密码给定盐和哈希(数据库泄露的情景)是多么困难。这实际上意味着用保存的盐散列所有可能的密码并将其与存储的参考散列进行比较。要减慢攻击者的速度,您需要使用慢速哈希函数来阻止大量密码比较。一个例子是反复散列结果哈希(几千次)。

salt防止彩虹表攻击,可以查询巨大的预计算数据库以查找原始哈希值。您(成功)通过盐随机化哈希函数来阻止该攻击向量。