1

我的用户在数据库中保存了一个密码字段,例如“0!ZWQ2”。我必须将我的用户输入密码从“aA1234”解读为“0!ZWQ2”,并将其与数据库中的数据进行比较。

我比较的 2 个字符串是:

“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890”与“9setybcpqwiuvxr108daj5'-`~!@#$%^&*()_+|}][{:.?/<>,;ZWQ2@#34KDA”</p>

这样 a = 9 和 0 = A

我将如何在 C# 中做到这一点,有什么想法吗?

我只需要从用户输入中获取密码字段并将其打乱为有趣的文本,以将其与数据库中的数据进行比较。

任何帮助将不胜感激。

问候艾蒂安

更新:(2009 年 2 月 10 日)感谢大家的回复。请注意,我确实意识到有更好的方法来处理这个问题。但请注意,我正在创建一个 ASP.NET 应用程序,该应用程序位于 SharePoint 内部,连接到 Cobol 平面文件数据,而不是适当的数据库。使用 Transoft 将我的 ASP.NET(ODBC 连接器)连接到 Cobol 平面文件。所以我必须坚持使用这段代码,这不会在我的私人网站上使用。我也无法控制何时在 Cobol 中创建密码。

4

5 回答 5

5

有什么特殊的理由不使用标准哈希+盐来存储密码,而不是凯撒密码?

应该解决它的一种方法(未经测试的代码):

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

以下是要转换的 Quick、Fast 和更少的代码示例。

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

首先,正如其他用户所说,如果您正在设计这个系统和密码存储方法,那么这种方法几乎毫无价值,应该使用许多更安全的方法。

但是,您要求此进行比较的事实使我认为您无法控制数据库中已有的内容,因此正在处理遗留的内容。

下面的函数会将您的用户密码作为字符串并将数据库密码作为字符串返回。需要注意的一点是,您提供的两个字符串长度不相等,因此对于字符 9 和 0 会崩溃。我已在 dbChars 字符串中添加了额外的字母 B 和 C。另外,我已经“假设”在映射字符中找不到的任何输入的字符都只是按照输入的方式附加。您可能要求忽略这些字符。

    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 方法,该方法采用 inputString 并(检查任何错误/恶意输入)使用您的密码方法对其进行变形。

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