PHP crypt()関数をC#に移植する際の問題
質問
古い
ただし、それを機能させるには、新しく入力したパスワードに基づいて、古いハッシュを新しく計算したハッシュと比較できる必要があります。
検索したところ、PHPによって呼び出されたcrypt()
の実装としてこれが見つかりました。
そして、これがC#での私のバージョンと予想される一致です。 ジェネラコディセタグプレ
何が間違っているのですか? FreeBSDバージョンでのMD5xxxx関数の動作についていくつかの大きな仮定をしていますが、動作しているようです。
これはPHPで使用される実際のバージョンではありませんか?誰かが何か洞察を持っていますか?
編集:
PHPのソースコードのコピーをダウンロードしたところ、glibcライブラリを使用していることがわかりました。そこで、glibcのソースコードのコピーをダウンロードし、__ md5_crypt_r関数を見つけ、その機能を複製し、FreeBSDバージョンとまったく同じハッシュで戻ってきました。
今、私はかなり困惑しています。 PHP4はPHP5とは異なる方法を使用しましたか?何が起こっているのですか?
解決
わかりました。答えは次のとおりです。
PHPは、crypt関数の glibc 実装を使用します。(添付:C#実装)
古いパスワードがハッシュと一致しない理由は、古いWebサイト(GoDaddyによってホストされている)が置かれているLinuxボックスに非標準のハッシュアルゴリズムがあったためです。(おそらく、アルゴリズムで行われたWEIRDの一部を修正するためです。)
ただし、次の実装をglibcの単体テストおよびPHPのWindowsインストールに対してテストしました。どちらのテストも100%合格しました。
編集
リンクは次のとおりです:(Github Gistに移動)
他のヒント
PHPの
いつでもsystem()(またはC#静的関数が呼び出されたもの)を、暗号化を行うphpコマンドラインスクリプトに出力できます。
ログインに成功した後でも、パスワードを強制的に変更することをお勧めします。次に、ユーザーが変更されたかどうかを示すフラグを設定できます。全員が変更したら、php呼び出しをダンプできます。
phpの実装を再利用するだけです... phpのcryptライブラリがシステム環境のパスにあることを確認してください...
文字列のマーシャリング/文字セットが正しいことを確認するために、相互運用メソッドを更新する必要がある場合があります...その後、元のハッシュアルゴリズムを使用できます。 ジェネラコディセタグプレ
些細なことではありません。
UPDATE :元々私は次のように書いています:「 PHPCrypt関数は標準のハッシュのようには見えません。なぜですか?誰が知っていますか。」コメントで指摘されているように、PHP crypt()は、BSDでpasswdcryptに使用されているものと同じです。それがデジュリスタンダードかどうかはわかりませんが、デファクトスタンダードです。だから。
私は、それが些細なことではないように見えるという私の立場を支持します。
コードを移植するのではなく、古いPHPを実行したままにして、古いパスワードのパスワード検証に厳密に使用することを検討してください。ユーザーがパスワードを変更するときは、もう少し「オープン」な新しいハッシュアルゴリズムを使用します。各ユーザーのハッシュと「ハッシュのフレーバー」を保存する必要があります。