比较2个字符串时如何用另一个值替换一个值?

时间:2009-02-09 13:28:15

标签: c# asp.net cobol transoft

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

我比较的两个字符串是:

“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890” 同 “!9setybcpqwiuvxr108daj5'-`〜@#$%^&安培; *()_ + |}] [{:?/<>; ZWQ2 @#为34kDa”

这样a = 9和0 = A

我如何在C#中做到这一点,任何想法?

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

任何帮助将不胜感激。

此致 艾蒂安

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

5 个答案:

答案 0 :(得分:5)

任何特殊原因都不使用标准哈希+盐来存储密码,而不是使用凯撒密码?

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

new string("aA1234".ToCharArray().Select(c => ScrambleChars[OriginalChars.IndexOf(c)]).ToArray());

答案 1 :(得分: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)

答案 2 :(得分:2)

您不应以可以反转的方式将密码保存在数据库中。数据库管理员或入侵您系统的黑客不应该能够获取用户存储的密码。

答案 3 :(得分: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();
    }

答案 4 :(得分:0)

我编写了一个包含Encode或Translate方法的Utility-class,该方法使用inputString和(检查任何错误/恶意输入)使用您的密码方法对其进行转换。

return String.Compare(dbPassword, PasswordUtility.Encode(inputString));