Asp.Net 常用工具類之加密——密碼可逆與不可逆(3)


    互聯網技術發展的很快,帶來的問題也是很多,密碼安全泄露事件、數據庫事件等等層出不窮。

 

    1、13年騰訊QQ賬號密碼泄露事件。

  

    2、15年攜程出現刪庫的事件。

                         

    3、前兩天亞馬遜出現四個小時的宕機事件,原因是因為程序員打錯了一個字符,導致半個互聯網癱瘓(說多少次了,我敲代碼的時候不要打擾我,打錯了一個字母可能導致整個互聯網癱瘓)!

                                       

 

  

    

 

  


 

  言歸正傳,今天主要講一下加密的可逆與不可逆!   

 

  前兩天我們講了RSA和DES兩種加密方式,他們都以加密密鑰key進行加解密,這樣可以得到加密后串,同時根據key和串可以得到解密密碼,這兩個加密按照分類是可逆的。

 

  當然在一些場景下,我們可能安全着想,進行不可逆加密,平常見到的MD5、SHA就是最典型的代表!

 

  MD5和SHA加密的時候不用所謂的key,同時一般情況下也不能進行解密,因為他是不可逆的,這樣做能夠保證一定的安全性,即使你有加密后的串,也不能進行破解(大牛勿論),比如你的數據庫用戶表password存的是md5加密后的串,那么即使別人得到也無可奈何!

  

  下面通過兩段代碼展示一下MD5和SHA加密方法:

  

  MD5:

using System;
using System.Security.Cryptography;
using System.Text;

namespace Utils.PassWord
{
    /// <summary>
    /// MD5加解密
    /// </summary>
    public static class MD5
    {
        /// <summary>
        /// MD5 16位加密,不可逆
        /// </summary>
        /// <param name="password"></param> 
        public static string Encrypt16Bit(string password)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            string str = BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes(password)), 4, 8);
            str = str.Replace("-", "");
            return str;
        }

        /// <summary>
        ///  MD5 32位加密,不可逆
        /// </summary>
        /// <param name="password"></param> 
        public static string Encrypt32Bit(string password)
        {
            string pwd = "";
            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] str = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
            for (int i = 0; i < str.Length; i++)         // 通過使用循環,將字節類型的數組轉換為字符串,此字符串是常規字符格式化所得
                pwd = pwd + str[i].ToString("X");        // 將得到的字符串使用十六進制類型格式。格式后的字符是小寫的字母,如果使用大寫(X)則格式后的字符是大寫字符 
            return pwd;
        }

        /// <summary>
        ///  MD5 64位加密,不可逆
        /// </summary>
        /// <param name="password"></param> 
        public static string Encrypt64Bit(string password)
        {
            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] str = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
            return Convert.ToBase64String(str);
        }
    }
}

調用方式

public static void md5()
{
    var str1 = MD5.Encrypt16Bit("123456789");
    var str2 = MD5.Encrypt32Bit("123456789");
    var str3 = MD5.Encrypt64Bit("123456789");
}
 
         

 

 

 

 

  SHA:  

using System.Linq;

namespace Utils.PassWord
{
    /// <summary>
    /// SHA加解密
    /// </summary>
    public static class SHA
    {
        /// <summary>
        /// SHA-1
        /// </summary>
        /// <param name="str"></param> 
        public static string SHA_1(string str)
        {
            System.Security.Cryptography.SHA1CryptoServiceProvider SHA1CSP = new System.Security.Cryptography.SHA1CryptoServiceProvider();
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
            byte[] bytHash = SHA1CSP.ComputeHash(bytValue);
            SHA1CSP.Clear();
            string hashstr = "", tempstr = "";
            for (int counter = 0; counter < bytHash.Count(); counter++)
            {
                long i = bytHash[counter] / 16;
                if (i > 9)
                    tempstr = ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr = ((char)(i + 0x30)).ToString();
                i = bytHash[counter] % 16;
                if (i > 9)
                    tempstr += ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr += ((char)(i + 0x30)).ToString();
                hashstr += tempstr;
            }
            return hashstr;
        }

        /// <summary>
        /// SHA-256
        /// </summary>
        /// <param name="str"></param> 
        public static string SHA_256(string str)
        {
            System.Security.Cryptography.SHA256CryptoServiceProvider SHA256CSP = new System.Security.Cryptography.SHA256CryptoServiceProvider();
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
            byte[] bytHash = SHA256CSP.ComputeHash(bytValue);
            SHA256CSP.Clear();
            string hashstr = "", tempstr = "";
            for (int counter = 0; counter < bytHash.Count(); counter++)
            {
                long i = bytHash[counter] / 16;
                if (i > 9)
                    tempstr = ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr = ((char)(i + 0x30)).ToString();
                i = bytHash[counter] % 16;
                if (i > 9)
                    tempstr += ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr += ((char)(i + 0x30)).ToString();
                hashstr += tempstr;
            }
            return hashstr;
        }

        /// <summary>
        /// SHA-384
        /// </summary>
        /// <param name="str"></param> 
        public static string SHA_384(string str)
        {
            System.Security.Cryptography.SHA384CryptoServiceProvider SHA384CSP = new System.Security.Cryptography.SHA384CryptoServiceProvider();
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
            byte[] bytHash = SHA384CSP.ComputeHash(bytValue);
            SHA384CSP.Clear();
            string hashstr = "", tempstr = "";
            for (int counter = 0; counter < bytHash.Count(); counter++)
            {
                long i = bytHash[counter] / 16;
                if (i > 9)
                    tempstr = ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr = ((char)(i + 0x30)).ToString();
                i = bytHash[counter] % 16;
                if (i > 9)
                    tempstr += ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr += ((char)(i + 0x30)).ToString();
                hashstr += tempstr;
            }
            return hashstr;
        }

        /// <summary>
        /// SHA-512
        /// </summary>
        /// <param name="str"></param> 
        public static string SHA_512(string str)
        {
            System.Security.Cryptography.SHA512CryptoServiceProvider SHA512CSP = new System.Security.Cryptography.SHA512CryptoServiceProvider();
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
            byte[] bytHash = SHA512CSP.ComputeHash(bytValue);
            SHA512CSP.Clear();
            string hashstr = "", tempstr = "";
            for (int counter = 0; counter < bytHash.Count(); counter++)
            {
                long i = bytHash[counter] / 16;
                if (i > 9)
                    tempstr = ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr = ((char)(i + 0x30)).ToString();
                i = bytHash[counter] % 16;
                if (i > 9)
                    tempstr += ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr += ((char)(i + 0x30)).ToString();
                hashstr += tempstr;
            }
            return hashstr;
        }
    }
}

調用方式:

 public static void sha()
 {
     var aaa1 = SHA.SHA_1("123456789");
     var aaa2 = SHA.SHA_256("123456789");
     var aaa3 = SHA.SHA_384("123456789");
     var aaa4 = SHA.SHA_512("123456789");
 }
 
         

 

 

  

  加解密這一塊這幾天也寫了幾篇,一些加解密原理性的東西我也不懂,這個涉及到更高深的密碼學,臣妾做不到!

 

  下一期我跟大家討論討論常用的Office組件功能,包括常用的csv,excel,html,pdf,word導入導出方法,預知詳情,下回分解。

 

  在這里感謝各位看官的支持,你的支持就是我的動力!

  

  個人頭條號:http://www.toutiao.com/m4129397771/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM