我的用户在数据库中保存了密码字段,例如“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中创建密码。
答案 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));