2

Dovecotでの認証には、SSHA256ハッシュを使用しますが、既存のハッシュに対して特定のパスワードを検証する方法がわかりません。SSHA256ハッシュの作成には、次のPHP関数(Webで見つかりました)が使用されます。

function ssha256($pw) {
        $salt = make_salt();
        return "{SSHA256}" . base64_encode( hash('sha256', $pw . $salt, true ) . $salt );
}

function make_salt() {
        $len   = 4;
        $bytes = array();
        for ($i = 0; $i < $len; $i++ ) {
                $bytes[] = rand(1,255);
        }
        $salt_str = '';
        foreach ($bytes as $b) {
                $salt_str .= pack('C', $b);
        }
        return $salt_str;
}

出力例:{SSHA256}lGq49JTKmBC49AUrk7wLyQVmeZ7cGl/V13A9QbY4RVKchckL

塩を抽出する必要がありますが、どうすればよいですか?私は問題を解決する方法を完全に失いました、誰かがこれについてのヒントを持っていますか?

助けてくれたみんなに感謝します!

Dovecot 1.2.15はこれらのスキームのみをサポートしているため、申し訳ありませんが、SSHA256を使用する必要があります。 CRYPT MD5 MD5-CRYPT SHA SHA1 SHA256 SMD5 SSHA SSHA256 PLAIN CLEARTEXT CRAM-MD5 HMAC-MD5 DIGEST-MD5 PLAIN-MD4 PLAIN-MD5 LDAP-MD5 LANMAN NTLM OTP SKEY RPA

4

2 に答える 2

2

ハッシュ値と一緒にソルトを保存する必要があります。

パスワードを検証する必要がある場合は、ユーザーが入力したパスワードと保存されているソルトを使用して、ハッシュを再度計算するだけです。ハッシュが一致する場合、ユーザーは正しいパスワードを入力しました。

あなたのフォーマットでは、base64_decode最初に使用してください。結果の最後の4バイトがソルトになります。

于 2013-02-17T14:52:45.517 に答える
2

パスワードハッシュにSHAファミリを使用しないでください。それらは高速で、ファイルを高速でハッシュするように設計されています。高価になるには、pashwordハッシュが必要です。bcrypt、PHPassを使用するか、私が自分で作成したこのクラスを使用してください(ただし、穴を開けることを学ぶまでは使用しないでください)。

class PassHash {
    public static function rand_str($length) {
        $total = $length % 2;
        $output = "";
        if ($total !== 0) {
            $count = floor($length / 2);
            $output .= ".";
        } else $count = $length / 2;

        $bytes = openssl_random_pseudo_bytes($count);
        $output .= bin2hex($bytes);

        // warning: prepending with a dot if the length is odd.
        // this can be very dangerous. no clue why you'd want your
        // bcrypt salt to do this, but /shrug

        return $output;
    }
    // 2y is an exploit fix, and an improvement over 2a. Only available in 5.4.0+
    public static function hash($input) {
        return crypt($input, "$2y$13$" . self::rand_str(22));

    }

    // legacy support, add exception handling and fall back to <= 5.3.0
    public static function hash_weak($input) {
        return crypt($input, "$2a$13$" . self::rand_str(22));
    }

    public static function compare($input, $hash) {
        return (crypt($input, $hash) === $hash);
    }
}

与えられた平文をハッシュし、そのハッシュを保存したものと比較する必要があります。塩はハッシュに保存され、ランダムである必要があります。必要に応じて、コショウを追加します。また、workrate変数を作成して、必要なときにいつでもworkrateを変更し、システムを機能させることができるようにする必要があります。


あなたが言うように、これを実装する方法がない場合は、次のようにハッシュを解凍できます。

function unpack_hash($hash) {
        $hash = base64_decode($hash);
        $split = str_split($hash, 64);
        return array("salt" => $split[1], "hash" => $split[0]);

これは、SHA256が256ビットまたは64の16進文字であるためです。最初の64文字がハッシュであると常に想定できます

于 2013-02-17T15:00:06.700 に答える