我试图将变量Senha
(我系统的密码)设置为原始值的md5哈希值。
public class Usuario
{
public int ID { get; set; }
[Required]
public string Nome { get; set; }
[Required]
public string Senha {
get { return Senha; }
set { Console.WriteLine("valor"+value );
this.Senha = CalculateMD5Hash(value); }
}
public static String CalculateMD5Hash(String input) {
// step 1, calculate MD5 hash from input
MD5 md5 = MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
byte[] hash = md5.ComputeHash(inputBytes);
// step 2, convert byte array to hex string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++) {
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString();
}
}
但是发生的事情是该类进入一个循环并使原始哈希值变为哈希值。
例如:value = 123
value1 = 202CB962AC59075B964B07152D234B70(值散列)
value2 = D9840773233FA6B19FDE8CAF765402F5(值为1的散列)
如何停止此循环并只触发一次该功能?
答案 0 :(得分:6)
您的财产未正确定义。不仅你的setter调用自己,你的getter也调用自己,并且会导致堆栈溢出。
相反,您需要提供支持字段来存储属性的值:
private string _senha;
public string Senha
{
get { return _senha; }
set
{
Console.WriteLine("valor"+value );
_senha = CalculateMD5Hash(value);
}
}
顺便说一下,既然您特别提到了“密码”这个词,using MD5 for passwords is a bad idea,那么除非您使用它来访问遗留系统,否则您应该真的这样做the right way。
答案 1 :(得分:2)
在这种情况下,您需要使用支持字段定义属性。
private string _senha;
public string Senha
{
get { return _senha; }
set { Console.WriteLine("valor"+value );
_senha = CalculateMD5Hash(value);
}
}