我有自己的密码加密 dll,用于在用户登录时检查用户密码,这在我的用户实体中被引用。
现在我已经创建了用户注册的功能,除了密码尚未加密外,它工作正常。
我的问题很简单,我应该把新用户密码的加密放在哪里?我不确定,因为我知道用户的密码不应该以纯文本形式传输,因此我不知道调用加密函数的最佳位置:
- 用户实体(其中加密 dll 已用于验证)。
- 保存用户方法所在的用户存储库。
- 控制用户创建视图的用户控制器。
- 其他我没有考虑过的地方!
非常感谢
我有自己的密码加密 dll,用于在用户登录时检查用户密码,这在我的用户实体中被引用。
现在我已经创建了用户注册的功能,除了密码尚未加密外,它工作正常。
我的问题很简单,我应该把新用户密码的加密放在哪里?我不确定,因为我知道用户的密码不应该以纯文本形式传输,因此我不知道调用加密函数的最佳位置:
非常感谢
首先,对于客户端-服务器通信,我建议您使用 SSL 来处理不以纯文本格式传输的敏感信息(如密码)。
之后,通常的做法是不在任何地方保存密码(即使使用加密,但要保存它们的哈希值。
您可以将哈希函数放入密码属性的 set 方法中。这是一个例子:
public class Member
{
private string _username;
public string Username
{
get { return _username; }
set { _username = value.ToLowerInvariant(); }
}
public string Passhash {get;set;}
public void SetPassword(string password)
{
Passhash = Crypto.Hash(password);
}
public bool CheckPassword(string password)
{
return string.Equals(Passhash, Crypto.Hash(password));
}
}
public static class Crypto
{
public static string Hash(string value)
{
return Convert.ToBase64String(
System.Security.Cryptography.SHA256.Create()
.ComputeHash(Encoding.UTF8.GetBytes(value)));
}
}
编辑:
正如 Craig Stuntz 所指出的,这个例子中的 Hash 代码非常简单。请参阅以下帖子以获取更安全的密码哈希方法:使用 MD5 或 sha-256 C# 哈希密码
在将负责做两件事的服务层方法中:
控制器动作当然会与服务层对话。
不要自己做密码散列,甚至不要考虑加密密码。
确保安全的努力是巨大的。使用基于公开可用规范和算法的现有方法。
//ENCODE
public string base64Encode(string sData)
{
try
{
byte[] encData_byte = new byte[sData.Length];
encData_byte = System.Text.Encoding.UTF8.GetBytes(sData);
string encodedData = Convert.ToBase64String(encData_byte);
return encodedData;
}
catch(Exception ex)
{
throw new Exception("Error in base64Encode" + ex.Message);
}
}
//DECODE
public string base64Decode(string sData)
{
try
{
System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
System.Text.Decoder utf8Decode = encoder.GetDecoder();
byte[] todecode_byte = Convert.FromBase64String(sData);
int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
char[] decoded_char = new char[charCount];
utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
string result = new String(decoded_char);
return result;
}
catch (Exception ex)
{
throw new Exception("Error in base64Decode" + ex.Message);
}
}
How to call
string encode= base64Encode(val);
string decode= base64Decode(val);
This is very helpful to decode and encode your string(password)