存储加密信息时应先加密后存储,存储到云中的数据也不例外,.NET 3.5提供了许多标准的加密算法,包括对称和非对称加密,对称加密比非对称加密更省资源,.NET 3.5托管的加密类都位于System.Security.Cryptography命名空间。
我们以AesManaged类加密算法为例,AesManaged提供了AES对称加密算法实现。清单1显示了加密代码,返回Base64编码的密文。
清单1 使用AesManaged类加密明文UTF-8字符串
public static string Encrypt(string input)
{
try
{
// 明文字符串输入
string data = input;
// 转换成一个UTF-8字节数组
byte[] utfData = UTF8Encoding.UTF8.GetBytes(data);
byte[] saltBytes = UTF8Encoding.UTF8.GetBytes(“S0d1umChl0r1de”);
// 使用PBKDF2标准产生基于密码的密钥
Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(“K3yPassw0rd!”, saltBytes);
// AES对称加密算法
AesManaged aes = new AesManaged();
// 设置AES参数
aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
aes.KeySize = aes.LegalKeySizes[0].MaxSize;
aes.Key = rfc.GetBytes(aes.KeySize / 8);
aes.IV = rfc.GetBytes(aes.BlockSize / 8);
// 加密
ICryptoTransform encryptTransf = aes.CreateEncryptor();
// 输出流,也可以是一个FileStream(文件流)
MemoryStream encryptStream = new MemoryStream();
CryptoStream encryptor =
new CryptoStream(encryptStream, encryptTransf, CryptoStreamMode.Write);
// 写,清洗,清除和关闭加密机
encryptor.Write(utfData, 0, utfData.Length);
encryptor.Flush();
encryptor.Clear();
encryptor.Close();
// 创建一个字节数组,将其转换成Base64编码字符串
byte[] encryptBytes = encryptStream.ToArray();
string encryptedString = Convert.ToBase64String(encryptBytes);
return encryptedString;
}
catch (Exception exEncr)
{
string msg = “AES Encryption error: ” + exEncr.Message;
if (RoleManager.IsRoleManagerRunning)
RoleManager.WriteToLog(“Critical”, msg);
return input;
}
}
PBKDF2是RSA实验室公钥加密标准(PKCS)的一部分,由IETF发布在RFC 2898中,PBKDF是Password-Based Key Derivation Function(基于密码的密钥生成功能)的缩写,它基于密码和salt字节数组创建一个共享的私密密钥用于加密和解密。
使用AesManaged加密类解密的代码如下:
清单2 使用AesManaged解密密文
public static string Decrypt(string base64Input)
{
try
{
//byte[] encryptBytes = UTF8Encoding.UTF8.GetBytes(input);
byte[] encryptBytes = Convert.FromBase64String(base64Input);
byte[] saltBytes = UTF8Encoding.UTF8.GetBytes(“S0d1umChl0r1de”);
// 使用PBKDF2标准产生基于密码的密钥
Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(“K3yPassw0rd!”, saltBytes);
// AES对称加密算法
AesManaged aes = new AesManaged();
// 设置AES参数
aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
aes.KeySize = aes.LegalKeySizes[0].MaxSize;
aes.Key = rfc.GetBytes(aes.KeySize / 8);
aes.IV = rfc.GetBytes(aes.BlockSize / 8);
// 解密
ICryptoTransform decryptTrans = aes.CreateDecryptor();
// 输出流,也可以是一个FileStream(文件流)
MemoryStream decryptStream = new MemoryStream();
CryptoStream decryptor =
new CryptoStream(decryptStream, decryptTrans, CryptoStreamMode.Write);
// 写,清洗,清除和关闭加密机
decryptor.Write(encryptBytes, 0, encryptBytes.Length);
decryptor.Flush();
decryptor.Clear();
decryptor.Close();
// 根据解密字节创建UTF字符串
byte[] decryptBytes = decryptStream.ToArray();
string decryptedString =
UTF8Encoding.UTF8.GetString(decryptBytes, 0, decryptBytes.Length);
return decryptedString;
}
catch (Exception exDecr)
{
string msg = “AES Decryption error: ” + exDecr.Message;
if (RoleManager.IsRoleManagerRunning)
RoleManager.WriteToLog(“Critical”, msg);
return base64Input;
}
}
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国