0

私は一日中問題の解決策を探していましたが、最終的に助けを求める投稿をすることにしました。これがこれを投稿するのに最適な場所かどうかは本当にわかりませんが、誰かが私を助けることができるかもしれません.

したがって、C# で単純なログイン フォームを作成しようとしています。データベースからユーザー名、MD5(パスワード)、およびソルトを取得する際にすべてが正常に機能します。今私の問題は、フォームから入力されたパスワードとソルトを比較する方法です。ユーザーがフォーラムでアカウントを作成するときに vbulleting がパスワードをどのように保存するかはわかりません。また、ソルトがランダムまたはユーザー名ベースである場合、彼がどのようにソルトを生成するかもわかりません。

誰でも私を助けることができますか?

編集: -

$vbulletin->userinfo['password'] != iif($password AND !$md5password, md5(md5($password) . $vbulletin->userinfo['salt']), '') AND
            $vbulletin->userinfo['password'] != iif($md5password, md5($md5password . $vbulletin->userinfo['salt']), '') AND
            $vbulletin->userinfo['password'] != iif($md5password_utf, md5($md5password_utf . $vbulletin->userinfo['salt']), '')

それが見つかりましたが、どうやってそれを作るのかまだ手がかりがないので、c#で再現しようとすることができます

よろしく、マッグ

4

2 に答える 2

0

だから、私の問題の解決策はここにあります。最終的に私はそれを機能させることができました。

問題は、C# がすべての文字列を Unicode として使用し、vbulletin がすべての文字列を UTF8 として使用することでした。

テストのために、新しいフォームを作成し、新しいテキストボックスとボタンを追加しました。これはとにかくデータベースに接続しません。データベースから直接取得したソルトを提供しました(テストのために)。

vbulleting logins は次のようにすでに述べられているため: md5(md5(password)+salt)

したがって、C# で同じことを再現するには、UTF8 を使用して解決策を示します。

static public string GetMd5Sum(string str)
    {
        //vBulletin uses UTF8 as strings, so you need to pass the user input string as UTF8 also
        Encoder enc = System.Text.Encoding.UTF8.GetEncoder();

        //Create a byte[] array to store the new UTF8 string
        byte[] utf8text = new byte[str.Length];

        //Pass the string to the byte[] array
        enc.GetBytes(str.ToCharArray(), 0, str.Length, utf8text , 0, true);

        //Hash the byte[] array with our UTF8 string inside
        MD5 md5 = new MD5CryptoServiceProvider();
        byte[] result = md5.ComputeHash(utf8text);

        //Build the final string by converting each byte
        //into hex and appending it to a StringBuilder
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < result.Length; i++)
        {
            sb.Append(result[i].ToString("x2")); //x2 here so the outcome result is all in lowercase, couse vbulleting also stores all in lowercase
        }

        //And return it
        return sb.ToString();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Get the user input password as plain text
        string pass = textBox1.Text;

        //Here i provided the salt explicit that i took from the database
        string salt = "N1GOt=>8sdO@E54)PH2@NCm5yI#]3u";

        //Here we convert the plain text password into the first hash
        string p1 = GetMd5Sum(pass);

        //Here we add the salt to the previous hashed password
        string p2 = p1 + salt;

        //Here we hash again the previous hashed password + the salt string
        string final = GetMd5Sum(p2);

        //this was just to the test to see if it all works as intended
        MessageBox.Show(final);
    }

これにより、データベースに保存されているのとまったく同じハッシュがパスワードとして出力されます。

私が抱えていたこの問題についてのすべての助けをありがとうuser2246647。

于 2013-06-30T15:15:39.467 に答える
0

コードを指定すると、フォーマットされます (これを無視すると、構文が壊れる可能性があります)。

    $vbulletin->userinfo['password'] != iif($password AND !$md5password,
        md5(md5($password) . $vbulletin->userinfo['salt']), '')
AND $vbulletin->userinfo['password'] != iif($md5password,
        md5($md5password . $vbulletin->userinfo['salt']), '')
AND $vbulletin->userinfo['password'] != iif($md5password_utf,
        md5($md5password_utf . $vbulletin->userinfo['salt']), '')

この式は「すべてのメソッドの失敗」を検出しますが、読みにくいので、De Morgan の暗黙の外部否定を適用して、「任意のメソッドの成功」の肯定的な一致として書き直しましょう。

    $vbulletin->userinfo['password'] == iif($password AND !$md5password,
        md5(md5($password) . $vbulletin->userinfo['salt']), '')
OR  $vbulletin->userinfo['password'] == iif($md5password,
        md5($md5password . $vbulletin->userinfo['salt']), '')
OR  $vbulletin->userinfo['password'] == iif($md5password_utf,
        md5($md5password_utf . $vbulletin->userinfo['salt']), '')

ここで、簡略化と注記を適用すると、C# で次のような結果になるように機能しますiff(x,y,z)x?y:z

   storedPW == password && !md5password ? md5(md5(password) + salt) : ''
|| storedPW == md5password ? md5(md5password + salt) : ''
|| storedPw == md5password_utf ? md5(md5password_utf + salt) : ''

チェックは少し醜いですが、私のコードではありません。認識すべき重要な点は、次のパターンです。

 md5(md5(password) + salt) -> storedPw

残念ながら、これはinsidepro リンクから一致しているはずです。そのツールを使用するときは、データベースからのハッシュではなく、平文のパスワードを提供していることを確認してください。md5(md5($pass).$salt)

YMMV。

于 2013-06-30T01:50:03.473 に答える