0

新的stackoverflow :)

我刚刚开始使用我在一些关于安全性的网站上找到的 bcrypt 函数。在我们的工作技术人员对我说之前,我从来没有真正担心过这个输出:

盐似乎总是在每个密码的前面。

这是正确的还是我做了一个主要的嘘声?:)

我使用的代码是这样的:

<?php
function bcrypt($password, $salt, $rounds=12) {
    // Check if bcrypt is available on the server
    if (CRYPT_BLOWFISH != 1) {
        throw new Exception("bcrypt stöds inte. Se http://php.net/crypt");
        return;
    }

    // Check that rounds are within the allowed range
    if ($rounds < 4)
        $rounds = 4;
    else if ($rounds > 12) 
        $rounds = 12;

    // Create a prefix to tell the crypt that we want to use bcrypt
    $salt_prefix = sprintf('$2a$%02d$', $rounds);

    // Check if the salt contains invalid characters:
    if (!preg_match('#^[A-Za-z0-9./]{22}$#', $salt)) {

        // The salt is not bcrypt-safe. Redo to 22 characters (A-Za-z0-9. /)
        $new_salt = base64_encode($salt);

        if (strlen($new_salt) < 22)

            $new_salt .= base64_encode(md5($salt));
            $salt = substr($new_salt, 0, 22);
            $salt = str_replace(array('+', '-'), '.', $salt);    
            $salt = str_replace(array('=', '_'), '/', $salt);
    }

    // hash the password with bcrypt
    return crypt($password, $salt_prefix.$salt);
 }

 // Examples :
 echo "Bcrypt: ". bcrypt('abc', 'QyrjMQfjgGIb4ymtdKQXIr', 12);
?>

这将输出:

Bcrypt: $2a$12$QyrjMQfjgGIb4ymtdKQXIewDBqhA3eNppF8qOrMhidnEbzNvmHqhy

如您所见,盐在密码中,现在为“粗体文本”:

盐 =QyrjMQfjgGIb4ymtdKQXIr

通过 = $2a$12$QyrjMQfjgGIb4ymtdKQXI

ewDBqhA3eNppF8qOrMhidnEbzNvmHqhy

无论盐如何,这似乎每次都是一样的。除了最后一个字符外,总是包含盐?

4

1 回答 1

0

您可以使用许多在线工具测试现有的 bcrypt 哈希,例如这个bcrypt 生成器

于 2016-01-29T09:43:45.677 回答