私の開発は 2 つのコンポーネントに分かれています。
- ウェブサイト、SHA512 を使用してパスワードを暗号化する FOSUserBundle を使用する Symfony アプリケーション、およびソルト。
- C でプログラムされた認証モジュール。ソルトとクリアテキスト パスワードが与えられると、SHA512 ソルト付きハッシュを再現できるはずです。
私の環境に関するいくつかの情報
- Linux Ubuntu 12.04 を使用しています。
ldd --version
回答EGLIBC 2.15-0ubuntu10.4 2.15 (おそらく 2.7 が必要ですか?しかしapt-get
、パッケージを正しくアップグレードすることになると、本当に苦痛です)。crypt.h
ヘッダー ファイルには、@(#)crypt.h 1.5 12/20/96が記載されています。
問題そのもの
私の問題は認証モジュールで発生します: Symfony の FOSUserBundle によって生成されたものと同じハッシュを取得できません。これが私の例です:
- Symfony が使用するパスワード salt は
bcccy6eiye8kg44scw0wk8g4g0wc0sk
. - パスワード自体は
test
この情報を使用して、Symfony はこの最終ハッシュを保存します。
fH5vVoACB4e8h1GX81n+aYiRkSWxeu4TmDibNChtLNZS3jmFKBZijGCXcfzCSJFg+YvNthxefHOBk65m/U+3OA==
ここで、私の C 認証モジュールで、次のコードを実行します (crypt.h
含まれています)。
char* password = "test";
char* salt = "$6$bcccy6eiye8kg44scw0wk8g4g0wc0sk";
char* hash = malloc(256);
memset(hash, 0, 256);
encode64(crypt(password, salt), hash, strlen(password));
fprintf(stdout, "%s\n", hash);
(これが私の base64 エンコーダーです: http://libremail.tuxfamily.org/sources/base64-c.htm )
そして、これは出力します...
JDYkYg==
これは、私の Symfony2 ハッシュとは完全に異なります。
スタックオーバーフローをブラウジングすると、同じ問題に遭遇した人によって書かれたこの質問 ( Symfony2 (FOSUserBundle) SHA512 hash does not match C# SHA512 hash ) が見つかりました (C# で)。だから私はこのテストを実行することにしました...
char* password = "test{bcccy6eiye8kg44scw0wk8g4g0wc0sk}";
char* salt = "$6$bcccy6eiye8kg44scw0wk8g4g0wc0sk"; // I tried without salt, or with "$6$" as well.
char* hash = malloc(256);
memset(hash, 0, 256);
encode64(crypt(password, salt), hash, strlen(password));
fprintf(stdout, "%s\n", hash);
もちろん、それは完全な失敗でした。
JDYkYmNjY3k2ZWl5ZThrZzQ0cyRycmN6TnpJUXFOYU1VRlZvMA==
さまざまな方法でパスワードとソルトを混ぜてみましたが、認証モジュールで Symfony のソルトを取得できませんでした。途中で見逃したものはありますか?Symfony の FOSUserBundle がパスワードを保存する方法を誤解していませんか?