1

私のユーザーは、データベースに「0!ZWQ2」などのパスワードフィールドを保存しています。ユーザー入力パスワードのスクランブルを「aA1234」から「0!ZWQ2」に解除し、データベース内のデータと比較する必要があります。

私が比較する2つの文字列は次のとおりです。

「abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890」と「9setybcpqwiuvxr108daj5'-`〜!@#$%^&*()_ + |}] [{:。?/ <> ,; ZWQ2 @#34KDA」</ p>

このように、a=9および0=A

C#でこれをどのように行うのですか、アイデアはありますか?

ユーザー入力からパスワードフィールドを取得し、それを面白いテキストにスクランブルして、データベース内のデータと比較する必要があります。

どんな助けでもありがたいです。

よろしくエティエンヌ

更新:(2009年2月10日)返信ありがとうございます。これを処理するより良い方法があることを私は理解していることに注意してください。ただし、適切なデータベースではなく、Cobolフラットファイルデータに接続するSharePoint内に配置されるASP.NETアプリケーションを作成していることに注意してください。Transoftを使用してASP.NET(ODBCコネクタ)をCobolフラットファイルに接続します。だから私はこのコードに固執する必要があり、これは私のプライベートサイトでは使用されません。また、Cobolでパスワードがいつ作成されるかを制御することもできません。

4

5 に答える 5

5

Caesars 暗号の代わりに、パスワードの保存に標準のハッシュ + ソルトを使用しない特別な理由はありますか?

それを解決する1つの方法(テストされていないコード):

new string("aA1234".ToCharArray().Select(c => ScrambleChars[OriginalChars.IndexOf(c)]).ToArray());
于 2009-02-09T13:31:15.693 に答える
5

以下は、変換するためのクイック、高速、およびより少ないコードの例です。

C# のコード:

        char[] OriginalChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
        char[] ScrambleChars = "9setybcpqwiuvxr108daj5'-`~!@#$%^&()+|}][{:.?/<>,;ZWQ2@#34KDART".ToCharArray();
        string TextToTransfer = "Hello";
        string NewText = "";
        foreach (char c in TextToTransfer)
        {
            NewText = NewText + ScrambleChars[Array.IndexOf<char>(OriginalChars, c)].ToString();
        }
        Console.WriteLine(NewText);

VB のコード:

    Dim OriginalChars() As Char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
    Dim ScrambleChars() As Char = "9setybcpqwiuvxr108daj5'-`~!@#$%^&()+|}][{:.?/<>,;ZWQ2@#34KDART"
    Dim TextToTransfer As String = "Hello"
    Dim NewText As String = ""
    For Each c As Char In TextToTransfer
        NewText += ScrambleChars(Array.IndexOf(OriginalChars, c))
    Next
    MsgBox(NewText)
于 2009-02-09T13:46:57.107 に答える
2

パスワードを元に戻せる方法でデータベースに保存しないでください。システムに侵入するデータベース管理者またはハッカーが、ユーザーの保存されたパスワードを取得できないようにする必要があります。

于 2009-02-09T13:35:12.860 に答える
1

まず、他のユーザーが述べているように、このシステムとパスワードの保存方法を設計している場合、この方法はほとんど価値がなく、代わりに使用する必要があるより多くの安全な方法があります.

ただし、比較を行うためにこれを求めているという事実は、データベースに既にあるものを制御できないため、レガシーなもので作業していると思います。

以下の関数は、ユーザーのパスワードを文字列として受け取り、データベースのパスワードを文字列として返します。あなたが提供した 2 つの文字列は同じ長さではないため、文字 9 と 0 でクラッシュすることに注意してください。文字 B と C を dbChars 文字列に追加しました。また、マッピング文字に見つからない入力文字は、入力したとおりに追加されると「想定」しています。これらの文字を無視する必要がある場合があります。

    private string DatabasePassword(string userPassword)
    {
        //Constants showing mapping between user password and database password
        const string userChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        const string dbChars   = "9setybcpqwiuvxr108daj5'-`~!@#$%^&()+|}][{:.?/<>,;ZWQ2@#34KDABC";

        //Stringbuilder used to build the database password for output
        System.Text.StringBuilder databasePassword = new System.Text.StringBuilder();

        //Run through every character in the user password
        foreach (Char userChar in userPassword)
        {
            //Find the index of the user character in the userChars string.
            int userCharIndex = userChars.IndexOf(userChar);

            //if the userChar exists in the userChars string then map the character to the
            //equivalent database pasword character else just use the entered char
            char mappedChar = userCharIndex >= 0 ? dbChars[userChars.IndexOf(userChar)] : userChar;

            //Append mapped password to the output database password
            databasePassword.Append(mappedChar);
        }

        return databasePassword.ToString();
    }
于 2009-02-09T14:22:07.333 に答える
0

入力文字列を受け取り、(悪い/悪意のある入力をチェックして)暗号化メソッドを使用して変換する Encode または Translate メソッドを含むユーティリティクラスを作成します。

return String.Compare(dbPassword, PasswordUtility.Encode(inputString));
于 2009-02-09T13:32:56.203 に答える