この記事の例では、PHP ユーザー パスワード暗号化アルゴリズムについて説明します。詳細は次のとおりです。
今日、二次開発で Discuz を使用していたときに、コード内の Discuz のユーザー名とパスワードを確認する必要がありました。その結果、誤って罠にはまってしまいました。 Discuz フォーラムにはユーザー データを保存するための 2 つのテーブルがあり、1 つは Discuz のデータベース Ultrax の pre_common_member に、もう 1 つは UCenter のデータベース ucenter の uc_members テーブルに保存されているためです。私は、ultrax ライブラリの pre_common_member データとそのパスワードがどのように生成されるかを研究するのに多くの時間を費やしました。検索した結果、ランダムに生成されたソルトをインターネット上で見つけました
このランダムに生成されたソルトをログインにどのように使用できるのか疑問に思っていました。いつ確認するのか?その後、Discuz は実際にはそのパスワードをまったく使用していないとネットで言われ、私も試してみましたが、案の定、pre_common_member のユーザー パスワードを変更しても、このパスワードは引き続き正常にログインできました。まったく、そのせいで私は大きく回り道をしてしまいました。
さて、本題に入ります。Discuz のパスワード暗号化アルゴリズムは、実際には 2 つの MD5 暗号化です。まず、平文で 1 回暗号化し、次にランダムにソルトを生成し、最初の暗号文の後に平文としてソルトを追加し、再度 MD5 を実行します。暗号化。ソルトは uc_members テーブルに保存され、ユーザー名によって取得できます。
こんな感じ:
MD5 (MD5(プレーンテキスト) + ソルト)
以下は.netの実装コードです:
string GetDiscuzPWString(string sourceStr, string salt) { return GetMd5Hash(string.Concat(GetMd5Hash(sourceStr),salt)); } string GetMd5Hash(string input) { MD5 md5Hasher = MD5.Create(); byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } return sBuilder.ToString(); }
パスワード判定方法をまとめると:
① UCをインストールする
② データベースを開くuc_members テーブルを見つけて、最後のフィールド「salt」を見つけてその中の値をコピーします
③ 疑似コード:
$s=md5(md5("密码")."salt字段的值"); echo $s;
④ IF を使用して判断します
⑤ もう一度言ってください!その乱数は 6 桁です!
この記事が PHP プログラミングの皆様のお役に立てれば幸いです。
PHP ユーザーパスワード暗号化アルゴリズム分析 [Discuz 暗号化アルゴリズム] 関連記事の詳細については、PHP 中国語 Web サイトに注目してください。