2009-02-09 35 views
1

我的用户有一个密码字段,例如保存在数据库中的“0!ZWQ2”。 我必须将我的用户输入密码从“aA1234”解密为“0!ZWQ2”,并将其与数据库中的数据进行比较。 !比较2个字符串时如何替换一个值?

的2串,我比较是:

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

这样一个= 9,0 = A

我怎么会做这在C#中,任何想法?

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

任何帮助将不胜感激。

问候 艾蒂安

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

+0

我刚刚回复你的确切要求。 它可以,如果你只是用来学习什么的。 但请小心谨慎,不要在实际项目中使用这种扰乱。这种工作可以在.net中内置许多加密技术。祝你好运:) – 2009-02-09 14:11:46

回答

5

以下是快速,快速和较少的代码示例进行转换。

代码在C#:

 char[] OriginalChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray(); 
     char[] ScrambleChars = "9setybcpqwiuvxr108daj5'-`[email protected]#$%^&()+|}][{:.?/<>,;[email protected]#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'-`[email protected]#$%^&()+|}][{:.?/<>,;[email protected]#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) 
5

不使用标准hash + salt存储密码而不使用Caesars密码的特殊原因?应该解决这个问题(未测试的代码)

方式一:

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

+1 - 这是通过默默无闻的安全。我希望我没有使用这个网站... – 2009-02-09 13:33:31

+0

在ASP.net中使用Cobol平面文件 – Etienne 2009-02-09 14:05:27

0

我会写一个实用工具类,它包含一个编码或翻译方法,采取inputString和(检查是否有坏/恶意输入)使用你的密码方法转换它。

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

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

1

首先,正如其他用户所指出的,如果你在设计这个系统和密码存储方法,则此方法是几乎一文不值并且有更多的安全方法应该用来代替。

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

下面的函数将您的用户密码作为字符串并将数据库密码作为字符串返回。有一件事要注意,你提供的两个字符串的长度并不相同,因此会出现字符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'-`[email protected]#$%^&()+|}][{:.?/<>,;[email protected]#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(); 
    }