我需要存储将与system.net.mail一起使用的电子邮件密码。这些需要检索并以纯文本形式发送,但我不想将它们存储为纯文本。这不是关于安全性的内部网,我只是不希望结果以纯文本形式显示在CMS中。
我已经阅读了很多文章说存储密码应该使用SHA1来完成。从我所读到的哈希是不好的,因为无法检索纯文本。
我目前正在尝试这种方法:
public static string EncodePasswordToBase64(string password)
{
try
{
byte[] encData_byte = new byte[password.Length];
encData_byte = System.Text.Encoding.UTF8.GetBytes(password);
string encodedData = Convert.ToBase64String(encData_byte);
return encodedData;
}
catch (Exception ex)
{
throw new Exception("Error in base64Encode" + ex.Message);
}
}
和
public static string DecodeFrom64(string encodedData)
{
System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
System.Text.Decoder utf8Decode = encoder.GetDecoder();
byte[] todecode_byte = Convert.FromBase64String(encodedData);
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;
}
但我似乎无法在我的数据库中找到正确的数据类型来存储值。它目前设置为 nvarchar(MAX)。
单元格内容显示如下(每个值之间有空格):
Q X B j L W V w M X B =
奇怪的是,当我点击并输入单元格来复制数据时,我得到的是:
Q
我应该为此列使用哪种数据类型?
答案 0 :(得分:0)
嗯,你是正确的哈希是不正确的方法。您实际想要使用的是 Symmetric Encryption ,这将允许您加密数据库中的数据,然后在主程序中将其解密。
AES是推荐的标准。 {C}中如何使用Here is an example。
我会更多地了解如何正确选择IV来避免common pitfalls。
答案 1 :(得分:0)
你可以使用这样的东西......
//用于加密字符串。
public static string Encrypt(string toEncrypt, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
string key = "UglyRandomKeyLike-lkj54923c478";
if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
hashmd5.Clear();
}
else
keyArray = UTF8Encoding.UTF8.GetBytes(key);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
tdes.Clear();
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
//解密字符串
public static string Decrypt(string cipherString, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = Convert.FromBase64String(cipherString);
string key = "UglyRandomKeyLike-lkj54923c478";
if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
hashmd5.Clear();
}
else
keyArray = UTF8Encoding.UTF8.GetBytes(key);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
tdes.Clear();
return UTF8Encoding.UTF8.GetString(resultArray);
}
上述方法将加密您的密码,您可以将其存储在数据库的varchar字段中。第二种方法采用加密密码并以普通字符串形式返回 我希望这就是你要找的......我无法对你的问题发表评论。