zoukankan      html  css  js  c++  java
  • 安全性之加密算法

    信息安全越来越重要的今天,系统设计和开发过程当中必要的加密技术必不可少,根据项目中的实际经验总结一下实际项目中安全使用场景。

    系统内部密码使用md5加密,密码不可逆,不可使用任何手段让任何人获取用户的密码,如果安全级别更高一些可以多次md5或混合加密。

    特殊字段的安全保密使用对称加密算法,常用的有DES/AES,对于当今的计算机发展速度,DES加密相对已经容易被破解,所以推荐使用AES进行加解密。

    .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的实现:

    第一步:根据上面的原理性介绍,我们需要生成公钥(发信方需要)和私钥(收信方需要),实现代码如下:
    //制造公钥和私钥的方法如下:
    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);

    简单实现:

    系统对外的一些接口会显示一些数据,为了这些数据的安全,接口提供的数据进行AES加密,然后客户端接收后再进行解密操作。如果你还在使用DES加密赶快进行替换吧。

    后续希望研究并运用:

    1、DDOS的防护技巧

    2、跨站点请求伪造

    3、XSS攻击

    4、文件上传漏洞

    5、信息垃圾过滤

  • 相关阅读:
    MSSQL中with(nolock)的用法
    google reader 使用快捷键
    HTML中em标签的用法
    js正则表达式
    C#中lock关键字的用法
    面试反思
    关于IE6.7.8.FF兼容的问题
    C#中DateTime.Now.Ticks的用法和说明
    JS中eval的用法
    这两天面试时不会的笔试题
  • 原文地址:https://www.cnblogs.com/wxj200589/p/4263065.html
Copyright © 2011-2022 走看看