相关问题:
Am I using PHP's crypt() function correctly?
Password storage hash with SHA-512 or crypt() with blowfish (bcrypt)
我正试图找出如何使用php安全地存储密码。经过一点阅读,我已经确定我应该使用crypt()而不是hash(),我应该使用blowfish(bcrypt)或sha-512算法,我相信bcrypt被推荐的频率更高,尽管对基于sha-512的算法也有很大的支持。
还有很多建议认为我的盐应该是尽可能随机的,有很多建议在coreopenssl_random_pseudo_bytes()rand()上使用mt_rand()
我的主要问题是:
如果我选择使用bcrypt,我应该考虑使用什么负载系数?我注意到对于php 5.5,新密码api中的默认加载因子是10,所以我想我至少需要这个值。
负载系数如何与密码安全相关?据我所知,该算法将迭代2^load_factor次,但我更感兴趣的是,这如何转化为对暴力破解方法的安全性。“安全”是什么意思?要10年才能破解吗?5年?1年?
为什么要选择bcrypt而不是基于sha-512的方法(反之亦然)?我听说sha-512被设计成一种快速的散列方法,所以随着时间的推移,它不会像bcrypt那样有效。这是真的吗?两种方法都有salt参数,允许crypt重复多次。
据我所知,我实现了以下生成bcrypt salt的测试代码。是推荐的方法吗?有更好的办法吗?
γ

function gen_salt($cost)
{
    return "$2y$" . $cost . "$" . str_replace('+', '.', base64_encode(openssl_random_pseudo_bytes(22)));
}

最佳答案

因此,基于这些评论,我创建了一个简单的基准来测试各种散列方法需要多长时间。

function bcrypt_salt($cost)
{
    return "$2y$" . $cost . "$" . str_replace('+', '.', base64_encode(openssl_random_pseudo_bytes(22))) . '$';
}

function sha512_salt($cost)
{
    return "\$6\$rounds=" . $cost . "\$" . openssl_random_pseudo_bytes(16) . '$';
}

$password = "stackoverflow";
$times = 1;
echo "<p>bcrypt method</p>";
for($iters = 10; $iters < 15; ++$iters)
{
    $salt = bcrypt_salt(strval($iters));
    $pword_crypt = crypt($password, $salt);
    $start_time = microtime(true);
    for($i = 0; $i < $times; ++$i)
    {
        crypt($password, $pword_crypt);
    }
    $end_time = microtime(true);
    echo "<p> cost = $iters: " . ($end_time - $start_time) . "</p>";
}

echo "<p>SHA512 method</p>";
for($iters = 1024; $iters < 1000000; $iters *= 2)
{
    $salt = sha512_salt(strval($iters));
    $pword_crypt = crypt($password, $salt);
    $start_time = microtime(true);
    for($i = 0; $i < $times; ++$i)
    {
        crypt($password, $pword_crypt);
    }
    $end_time = microtime(true);
    echo "<p> log2(iters) = ". log($iters,2) . ": " . ($end_time - $start_time) . "</p>";
}

基准测试结果(以秒为单位):
使用i5-m430在我的笔记本上运行:
BCRYPT法
成本=10:0.1174030339551
成本=11:0.23875308036804
成本=12:0.46739792823792
成本=13:0.96053194999695
成本=14:1.8993430137634
SHA512方法
对数2(iters)=10:0.0034840106964111
对数2(iters)=11:0.0077731609344482
对数2(iters)=12:0.01460480690024
对数2(iters)=13:0.02855396270752
对数2(iters)=14:0.068222999572754
对数2(iters)=15:0.12677311897278
对数2(iters)=16:0.24734497070312
对数2(iters)=17:0.54663610458374
对数2(iters)=18:1.0215079784393
对数2(iters)=19:2.0223300457001
在所有条件相同的情况下,sha-512方法的迭代次数要比bcrypt要高得多,才能占用相同的时间。尽管如此,我想任何至少需要十分之一秒的方法都是足够的。

09-11 16:31