【问题标题】:Is this overkill? Dynamic salt encryption for whirlpool password encryption这是矫枉过正吗?漩涡密码加密的动态盐加密
【发布时间】:2014-04-08 20:24:09
【问题描述】:

我想我在漩涡中的密码加密方面可能有点矫枉过正。

这就是盐生成代码的作用,一步一步

  1. 生成一个长度为10的伪随机字符串,它有这些可能的值:

    0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

  2. 一个真正的从-2到123的随机数是由大气噪声产生的

  3. 此伪随机字符串和完全随机数与 unix 时间戳一起打乱。
  4. 然后使用 md5 对该预加盐进行加密。

这只是盐的生成,我也在漩涡中加密了整个东西

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();
?>

另外,盐应该多长时间?我个人认为散列其他类型的字符并不那么重要,因为没有人暴力破解整个 salt,我不这么认为。就这样!提前致谢。此外,任何更好或更有效的方法都会有所帮助。

【问题讨论】:

  • 没有比杀戮更过分的杀戮。
  • 不错的一个:P 我感觉从大气噪声中生成数字非常有效。
  • 你用什么样的设备来消除大气噪音?
  • random.org 提供这个。
  • 如果您想要比当前脚本运行得更快的任何东西,您可以只依赖操作系统的熵,而不是使用此 Web 服务。

标签: php security encryption hash whirlpool


【解决方案1】:

Miguel Ibarra Romero 有一篇与这个特定主题相关的优秀文章:

Risks and Challenges of Password Hashing

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

在实施方面:我强烈建议不要使用您没有任何物理控制权的真实随机数源。从其他人的网站获取随机数,尽管它可能很方便,但并不是可靠的安全做法。你不知道这些数字来自哪里、它们是如何产生的、它们有多大的偏见以及是否有你收到它们的记录。

【讨论】:

    【解决方案2】:

    关于密码学的一般准则:永远不要编写自己的密码!这包括创建自己的算法和实施公开的同行评审系统。要想做到正确太难了(即使对于专家来说也是如此)。

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


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

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

    您应该担心的方面是给定盐和哈希(数据库泄露的场景)暴力破解密码有多难。这实际上意味着使用保存的盐对所有可能的密码进行哈希处理,并将其与存储的参考哈希进行比较。要减慢攻击者的速度,您需要使用 slow 哈希函数来防止大量密码比较。一个例子是一次又一次地散列生成的散列(几千次)。

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

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 2014-01-24
      • 2015-07-19
      • 2012-07-05
      相关资源
      最近更新 更多