C# 如何在从web应用程序输入的数据库中以加密格式存储密码?
在我的应用程序中有一个密码字段。当用户输入密码时,它应该加密该密码并存储到数据库中。当用户登录到该应用程序时,应该从数据库获取密码并进行解密C# 如何在从web应用程序输入的数据库中以加密格式存储密码?,c#,asp.net,sql-server-2008,C#,Asp.net,Sql Server 2008,在我的应用程序中有一个密码字段。当用户输入密码时,它应该加密该密码并存储到数据库中。当用户登录到该应用程序时,应该从数据库获取密码并进行解密 有可能吗 当您配置passwordFormat=“Hashed” 但若你们想自己滚,那个么你们会想研究一下咸密码。例如您可以查看链接,它可以让您朝着正确的方向开始 尽管如此,通常的做法是存储密码本身的哈希值,而不是密码的加密版本。散列将允许您检查用户是否输入了正确的密码(通过将数据库中的散列值与用户输入的任何内容的散列值进行比较),而无需知道实际密码是什么
有可能吗 当您配置
passwordFormat=“Hashed”
但若你们想自己滚,那个么你们会想研究一下咸密码。例如您可以查看链接,它可以让您朝着正确的方向开始
尽管如此,通常的做法是存储密码本身的哈希值,而不是密码的加密版本。散列将允许您检查用户是否输入了正确的密码(通过将数据库中的散列值与用户输入的任何内容的散列值进行比较),而无需知道实际密码是什么
这样做的好处是它通常更简单、更安全,因为您不需要加密/解密任何值。使用哈希的缺点是,您永远无法向用户发送密码(如果您计划提供某种“忘记我的密码”功能),而是必须将其重置为新的随机密码。您可以在SQL SERVER中创建SQLCLR UDF,我使用两种主要方法以加密格式保存密码 Pwdencryp()t加密密码,返回加密字符串。设置密码时使用此选项,加密密码存储在master..syslogins表中 Pwdcompare()接受清除密码和加密密码,并通过加密清除密码并比较两者来检查它们是否匹配。当您键入密码以登录SQL Server时,将调用此例程
获取哈希密码的最简单方法如下所示。
FormsAuthentication.HashPasswordForStoringInConfigFile(“字符串的值”,FormsAuthPasswordFormat.MD5.ToString())代码>如果您不希望使用ASP.NET成员资格和角色提供程序,这可能对您有用:
/// <summary>
/// Decrypts the specified encryption key.
/// </summary>
/// <param name="encryptionKey">The encryption key.</param>
/// <param name="cipherString">The cipher string.</param>
/// <param name="useHashing">if set to <c>true</c> [use hashing].</param>
/// <returns>
/// The decrypted string based on the key
/// </returns>
public static string Decrypt(string encryptionKey, string cipherString, bool useHashing)
{
byte[] keyArray;
//get the byte code of the string
byte[] toEncryptArray = Convert.FromBase64String(cipherString);
System.Configuration.AppSettingsReader settingsReader =
new AppSettingsReader();
if (useHashing)
{
//if hashing was used get the hash code with regards to your key
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(encryptionKey));
//release any resource held by the MD5CryptoServiceProvider
hashmd5.Clear();
}
else
{
//if hashing was not implemented get the byte code of the key
keyArray = UTF8Encoding.UTF8.GetBytes(encryptionKey);
}
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
//set the secret key for the tripleDES algorithm
tdes.Key = keyArray;
//mode of operation. there are other 4 modes.
//We choose ECB(Electronic code Book)
tdes.Mode = CipherMode.ECB;
//padding mode(if any extra byte added)
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(
toEncryptArray, 0, toEncryptArray.Length);
//Release resources held by TripleDes Encryptor
tdes.Clear();
//return the Clear decrypted TEXT
return UTF8Encoding.UTF8.GetString(resultArray);
}
/// <summary>
/// Encrypts the specified to encrypt.
/// </summary>
/// <param name="toEncrypt">To encrypt.</param>
/// <param name="useHashing">if set to <c>true</c> [use hashing].</param>
/// <returns>
/// The encrypted string to be stored in the Database
/// </returns>
public static string Encrypt(string encryptionKey, string toEncrypt, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
System.Configuration.AppSettingsReader settingsReader =
new AppSettingsReader();
//If hashing use get hashcode regards to your key
if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(encryptionKey));
//Always release the resources and flush data
// of the Cryptographic service provide. Best Practice
hashmd5.Clear();
}
else
keyArray = UTF8Encoding.UTF8.GetBytes(encryptionKey);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
//set the secret key for the tripleDES algorithm
tdes.Key = keyArray;
//mode of operation. there are other 4 modes.
//We choose ECB(Electronic code Book)
tdes.Mode = CipherMode.ECB;
//padding mode(if any extra byte added)
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateEncryptor();
//transform the specified region of bytes array to resultArray
byte[] resultArray =
cTransform.TransformFinalBlock(toEncryptArray, 0,
toEncryptArray.Length);
//Release resources held by TripleDes Encryptor
tdes.Clear();
//Return the encrypted data into unreadable string format
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
//
///解密指定的加密密钥。
///
///加密密钥。
///密码字符串。
///如果设置为true[使用哈希]。
///
///基于密钥的解密字符串
///
公共静态字符串解密(字符串加密密钥、字符串密码字符串、bool useHashing)
{
字节[]键数组;
//获取字符串的字节码
字节[]到加密数组=Convert.FromBase64String(cipherString);
System.Configuration.AppSettings阅读器设置阅读器=
新应用程序设置阅读器();
如果(使用哈希)
{
//如果使用了哈希,则获取与密钥相关的哈希代码
MD5CryptoServiceProvider hashmd5=新的MD5CryptoServiceProvider();
keyArray=hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(encryptionKey));
//释放MD5CryptoServiceProvider持有的任何资源
hashmd5.Clear();
}
其他的
{
//如果未实现哈希,则获取密钥的字节码
keyArray=UTF8Encoding.UTF8.GetBytes(encryptionKey);
}
TripleDESCryptoServiceProvider tdes=新的TripleDESCryptoServiceProvider();
//为tripleDES算法设置密钥
密钥=密钥数组;
//操作模式。还有其他4种模式。
//我们选择ECB(电子密码本)
tdes.Mode=CipherMode.ECB;
//填充模式(如果添加了任何额外字节)
tdes.Padding=PaddingMode.PKCS7;
ICryptoTransform cTransform=tdes.CreateDecryptor();
字节[]resultArray=cTransform.TransformFinalBlock(
toEncryptArray,0,toEncryptArray.Length);
//释放TripleDes Encryptor持有的资源
tdes.Clear();
//返回已解密的明文
返回UTF8Encoding.UTF8.GetString(resultArray);
}
///
///加密指定要加密的文件。
///
///加密。
///如果设置为true[使用哈希]。
///
///要存储在数据库中的加密字符串
///
公共静态字符串加密(字符串加密密钥、字符串到加密、布尔使用哈希)
{
字节[]键数组;
byte[]toEncryptArray=UTF8Encoding.UTF8.GetBytes(toEncrypt);
System.Configuration.AppSettings阅读器设置阅读器=
新应用程序设置阅读器();
//如果使用哈希,请获取与密钥相关的哈希代码
如果(使用哈希)
{
MD5CryptoServiceProvider hashmd5=新的MD5CryptoServiceProvider();
keyArray=hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(encryptionKey));
//始终释放资源并刷新数据
//提供的加密服务。最佳实践
hashmd5.Clear();
}
其他的
keyArray=UTF8Encoding.UTF8.GetBytes(encryptionKey);
TripleDESCryptoServiceProvider tdes=新的TripleDESCryptoServiceProvider();
//为tripleDES算法设置密钥
密钥=密钥数组;
//操作模式。还有其他4种模式。
//我们选择ECB(电子密码本)
tdes.Mode=CipherMode.ECB;
//填充模式(如果添加了任何额外字节)
tdes.Padding=PaddingMode.PKCS7;
ICryptoTransform cTransform=tdes.CreateEncryptor();
//将指定的字节数组区域转换为resultArray
字节[]结果数组=
cTransform.TransformFinalBlock(toEncryptArray,0,
toEncryptArray.Length);
//释放TripleDes Encryptor持有的资源
tdes.Clear();
//将加密数据返回到un
string hashedpassword= FormsAuthentication.HashPasswordForStoringInConfigFile("your password", "SHA1");
string hashedPassword = Security.HashSHA1(txtPassword.Value.Trim());
public class Security
{
public static string HashSHA1(string value)
{
var sha1 = System.Security.Cryptography.SHA1.Create();
var inputBytes = Encoding.ASCII.GetBytes(value);
var hash = sha1.ComputeHash(inputBytes);
var sb = new StringBuilder();
for (var i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString();
}
}