我需要Base64编码,我的盐(散列密码)?(Do I need base64 encode my

2019-09-30 06:01发布

请原谅我这个非常奇怪的问题。 我明白Base64编码传输数据(即MIME的Base64编码)的目的,但我不知道如果我需要Base64编码,我的盐。

我写了一个实用工具类(基抽象类确实):

use Symfony\Component\Security\Core\Encoder\BasePasswordEncoder;

abstract class AbstractCryptPasswordEncoder extends BasePasswordEncoder
{
    /**
     * @return string
     */
    protected abstract function getSaltPrefix();

    /**
     * @return string
     */
    protected abstract function getSalt();

    /**
     * {@inheritdoc}
     */
    public function encodePassword($raw, $salt = null)
    {
        return crypt($raw, $this->getSaltPrefix().$this->getSalt());
    }

    /**
     * {@inheritdoc}
     */
    public function isPasswordValid($encoded, $raw, $salt = null)
    {
        return $encoded === crypt($raw, $encoded);
    }
}

真正的实现类将是:

class Sha512CryptPasswordEncoder extends AbstractCryptPasswordEncoder
{
    /**
     * @var string
     */
    private $rounds;

    /**
     * @param null|int $rounds The number of hashing loops
     */
    public function __construct($rounds = null)
    {
        $this->rounds = $rounds;
    }

    /**
     * {@inheritdoc}
     */
    protected  function getSaltPrefix()
    {
        return sprintf('$6$%s', $this->rounds ? "rounds={$this->rounds}$" : '');
    }

    /**
     * {@inheritdoc}
     */
    protected function getSalt()
    {
        return base64_encode(openssl_random_pseudo_bytes(12));
    }
}

关键的部分是盐的一代,将被嵌入密码:我需要base64_encode以任何理由(存储),假设它会通过线路不会发送?

Answer 1:

每个哈希算法预计盐在给定的字母,这意味着使用base64_encode()可能是正确的事情,但往往它要么不使用完整的字母或返回不在这个字母字符。

就拿BCrypt例如,这是密码(SHA-512是不恰当的,因为它是太快了)一个好的哈希算法,它接受除了“+”字符base64编码字符串的所有字符。 在另一边则接受“” 不属于base64编码串的一部分字符。

PHP 5.5将有功能password_hash()password_verify()准备好,使BCrypt的使用更容易,我真的可以推荐他们。 还有一个兼容包可用于老版本PHP,线121上可以看到base64_encode()确实使用,但事后都无效“+”字符都被允许更换“” 特点:

编码BCrypt盐:

$salt = str_replace('+', '.', base64_encode($buffer));


Answer 2:

BASE64用于二进制数据编码成文本表示。 它允许使用文本通道来传输二进制数据。 如果你想存储在DB哈希密码,你不必编码它 - 它已经在文本格式。



文章来源: Do I need base64 encode my salt (for hashing passwords)?