安全性之加密算法
信息安全越來越重要的今天,系統(tǒng)設計和開發(fā)過程當中必要的加密技術必不可少,根據(jù)項目中的實際經(jīng)驗總結一下實際項目中安全使用場景。
系統(tǒng)內(nèi)部密碼使用md5加密,密碼不可逆,不可使用任何手段讓任何人獲取用戶的密碼,如果安全級別更高一些可以多次md5或混合加密。
特殊字段的安全保密使用對稱加密算法,常用的有DES/AES,對于當今的計算機發(fā)展速度,DES加密相對已經(jīng)容易被破解,所以推薦使用AES進行加解密。
.Net的DES加密算法實現(xiàn)
/// <summary> /// 獲取密鑰 /// </summary> private static string Key { get { return @"ads{}[]19123456789123456789a},ds"; } } /// <summary> /// 獲取向量 /// </summary> private static string IV { get { return @"123456789{},';s"; } } /// <summary> /// AES加密 /// </summary> /// <param name="plainStr">明文字符串</param> /// <returns>密文</returns> public static string AESEncrypt(string plainStr) { byte[] bKey = Encoding.UTF8.GetBytes(Key); byte[] bIV = Encoding.UTF8.GetBytes(IV); byte[] byteArray = Encoding.UTF8.GetBytes(plainStr); string encrypt = null; Rijndael aes = Rijndael.Create(); try { using (MemoryStream mStream = new MemoryStream()) { using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write)) { cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); encrypt = Convert.ToBase64String(mStream.ToArray()); } } } catch { } aes.Clear(); return encrypt; } /// <summary> /// AES加密 /// </summary> /// <param name="plainStr">明文字符串</param> /// <param name="returnNull">加密失敗時是否返回 null,false 返回 String.Empty</param> /// <returns>密文</returns> public static string AESEncrypt(string plainStr, bool returnNull) { string encrypt = AESEncrypt(plainStr); return returnNull ? encrypt : (encrypt == null ? String.Empty : encrypt); } /// <summary> /// AES解密 /// </summary> /// <param name="encryptStr">密文字符串</param> /// <returns>明文</returns> public static string AESDecrypt(string encryptStr) { byte[] bKey = Encoding.UTF8.GetBytes(Key); byte[] bIV = Encoding.UTF8.GetBytes(IV); byte[] byteArray = Convert.FromBase64String(encryptStr); string decrypt = null; Rijndael aes = Rijndael.Create(); try { using (MemoryStream mStream = new MemoryStream()) { using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write)) { cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); decrypt = Encoding.UTF8.GetString(mStream.ToArray()); } } } catch { } aes.Clear(); return decrypt; } /// <summary> /// AES解密 /// </summary> /// <param name="encryptStr">密文字符串</param> /// <param name="returnNull">解密失敗時是否返回 null,false 返回 String.Empty</param> /// <returns>明文</returns> public static string AESDecrypt(string encryptStr, bool returnNull) { string decrypt = AESDecrypt(encryptStr); return returnNull ? decrypt : (decrypt == null ? String.Empty : decrypt); }
非對稱加密.net的實現(xiàn):
第一步:根據(jù)上面的原理性介紹,我們需要生成公鑰(發(fā)信方需要)和私鑰(收信方需要),實現(xiàn)代碼如下: //制造公鑰和私鑰的方法如下: RSACryptoServiceProvider crypt = new RSACryptoServiceProvider(); string publickey = crypt.ToXmlString(false);//公鑰 string privatekey = crypt.ToXmlString(true);//私鑰 crypt.Clear(); 第二步:發(fā)信方使用公鑰對明文進行加密,實現(xiàn)代碼如下: StreamReader sr = new StreamReader(Server.MapPath("a.txt"), UTF8Encoding.UTF8); string readpublickey = sr.ReadToEnd(); //包含 RSA 密鑰信息的 XML 字符串。 sr.Close(); UTF8Encoding enc = new UTF8Encoding(); byte[] bytes = enc.GetBytes(TextBox1.Text.Trim()); RSACryptoServiceProvider crypt = new RSACryptoServiceProvider(); crypt.FromXmlString(readpublickey); bytes = crypt.Encrypt(bytes, false); string encryttext = Convert.ToBase64String(bytes); string abb = Server.UrlEncode(encryttext); Response.Write("密文為:" + abb); 第三步:收信方使用私鑰對密文進行解密,實現(xiàn)代碼如下: StreamReader sr = new StreamReader(Server.MapPath("b.txt"), UTF8Encoding.UTF8); string readprivatekey = sr.ReadToEnd(); sr.Close(); RSACryptoServiceProvider crypt = new RSACryptoServiceProvider(); UTF8Encoding enc = new UTF8Encoding(); byte[] bytes = Convert.FromBase64String(@Server.UrlDecode(TextBox1.Text.Trim())); crypt.FromXmlString(readprivatekey); byte[] decryptbyte = crypt.Decrypt(bytes, false); string decrypttext = enc.GetString(decryptbyte); Response.Write("明文為:" + decrypttext);
簡單實現(xiàn):
系統(tǒng)對外的一些接口會顯示一些數(shù)據(jù),為了這些數(shù)據(jù)的安全,接口提供的數(shù)據(jù)進行AES加密,然后客戶端接收后再進行解密操作。如果你還在使用DES加密趕快進行替換吧。
后續(xù)希望研究并運用:
1、DDOS的防護技巧
2、跨站點請求偽造
3、XSS攻擊
4、文件上傳漏洞
5、信息垃圾過濾
浙公網(wǎng)安備 33010602011771號