安全性之加密算法

信息安全愈來愈重要的今天,系統設計和開發過程中必要的加密技術必不可少,根據項目中的實際經驗總結一下實際項目中安全使用場景。算法

系統內部密碼使用md5加密,密碼不可逆,不可以使用任何手段讓任何人獲取用戶的密碼,若是安全級別更高一些能夠屢次md5或混合加密。安全

特殊字段的安全保密使用對稱加密算法,經常使用的有DES/AES,對於當今的計算機發展速度,DES加密相對已經容易被破解,因此推薦使用AES進行加解密。ide

.Net的DES加密算法實現加密

/// <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的實現:spa

第一步:根據上面的原理性介紹,咱們須要生成公鑰(發信方須要)和私鑰(收信方須要),實現代碼以下:
//製造公鑰和私鑰的方法以下:
RSACryptoServiceProvider crypt = new RSACryptoServiceProvider();
string  publickey = crypt.ToXmlString(false);//公鑰
string  privatekey = crypt.ToXmlString(true);//私鑰
crypt.Clear();
 
第二步:發信方使用公鑰對明文進行加密,實現代碼以下:
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);
 
第三步:收信方使用私鑰對密文進行解密,實現代碼以下:
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);

簡單實現:.net

系統對外的一些接口會顯示一些數據,爲了這些數據的安全,接口提供的數據進行AES加密,而後客戶端接收後再進行解密操做。若是你還在使用DES加密趕快進行替換吧。設計

後續但願研究並運用:code

一、DDOS的防禦技巧blog

二、跨站點請求僞造接口

三、XSS攻擊

四、文件上傳漏洞

五、信息垃圾過濾

相關文章
相關標籤/搜索