1

この非常に奇妙な質問で失礼します。データを送信するための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ネットワーク経由で送信されることはないと想定して、何らかの理由(保存)が必要ですか?

4

2 に答える 2

3

各ハッシュアルゴリズムは、特定のアルファベットのソルトを想定しています。つまり、使用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));
于 2013-02-01T15:13:12.910 に答える
1

BASE64は、バイナリデータをテキスト表現にエンコードするために使用されます。テキストチャネルを使用してバイナリデータを転送できます。ハッシュ化されたパスワードをDBに保存する場合は、エンコードする必要はありません。すでにテキスト形式になっています。

于 2013-02-01T14:18:34.540 に答える