常用的加密演算法介紹——MD5

我不是高手,我只是一個普通的程式設計師,我特別願意大家留言討論,批評指正,您給我指正了,我就去查資料,去做實驗,我技術就能得到提高,我認為這是一個程式設計師的基本素養。

序言

:程式設計師在實際的開發中會或多或少地用到一些加密的演算法,如base64、md5、dex、aex、rsa等等。但是演算法的種類很多,初學者經常會一頭霧水,雖然也使用了,但是總感覺懵懵懂懂,今天我就對常用的一些演算法做一個梳理和總結,我也不是高手,只是憑著自己的理解對自己以前用到過的做一個淺淺的整理,可能不知道的或者沒介紹到的演算法還有很多,希望大家留言指正。

一,演算法的分類

1,hash演算法(摘要演算法):MD5,

SHA1

SHA2(SHA256,SHA384,SHA512),此類演算法只是摘要,是不可逆的,你拿到一個摘要值是沒法還原出來原始資料的。

2,對稱加密演算法:DES

3DES

,AES。

3,非對稱加密演算法:RSA

二,演算法的使用

1,摘要演算法的使用,首先摘要演算法並不是加密演算法,只是驗證資料一致性的演算法,

摘要演算法又稱雜湊演算法、雜湊演算法。

比較常用的就是MD5,SHA256。摘要演算法的最常使用場景就是比較資訊的一致性,為什麼不直接比較呢,因為有時候資訊的資料量會很大,而MD5以後是可以提取一個32長度的摘要,只比較這個32位的字串一致性就可以了。只要資訊資料是一樣的兩個資料MD5以後的這個32位長度的摘要值就是一樣的,哪怕你變化了一個位元組,這個MD5以後的摘要值就不一樣了。

下面我們做一個實驗,linux下有個命令叫md5sum,windows下有個命令叫CertUtil。

隨便找到一個檔案,或者自己新建一個檔案,linux下執行

md5sum aaa。txt

常用的加密演算法介紹——MD5

windows下執行

CertUtil -hashfile aaa。txt MD5

常用的加密演算法介紹——MD5

然後對檔案內容做一下修改,再執行命令,發現這個摘要值已經發生了變化,再把內容改回去,發現又變回和剛才一樣了。一般某些軟體的官方下載網站都會提供一個該軟體的MD5以後的hash值。如果下載了軟體以後,或者是從其他渠道得到的軟體。你都可以透過上面的命令來計算一下你手裡的軟體的hash值和官方提供的hash值是否一致,如果不一致你手裡的檔案就可能是被篡改過的,加了廣告外掛啊,或者下載不完整啊,或者版本不一致啊等等。

MD5還有一個常用的場景就是各種資訊系統的密碼儲存,把使用者設定的密碼(正確的稱呼其實是口令)以md5加密後的值存到資料庫裡,這樣即使是系統被暴庫了,看到的使用者密碼也都是MD5以後的,不是明文,也就沒法知道使用者設定的密碼了。系統在使用者登入的時候,也是把使用者輸入的密碼進行MD5以後再跟資料庫裡儲存的MD5後的密碼進行比較就行了,為了安全,一般還會加上salt(鹽值)。

下面演示一下常用的程式語言是如何進行MD5加密的。

java類public static void main(String[] args) {        String dataStr = “hello”;        try {            MessageDigest m = MessageDigest。getInstance(“MD5”);            m。update(dataStr。getBytes(“UTF8”));            byte s[] = m。digest();            String result = “”;            for (int i = 0; i < s。length; i++) {                String hexStr=Integer。toHexString((0x000000FF & s[i]) | 0xFFFFFF00);                result += Integer。toHexString((0x000000FF & s[i]) | 0xFFFFFF00)。substring(6);            }            System。out。println(result);        } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {            e。printStackTrace();        }}如果是Spring boot專案就簡單了,spring封裝了工具類String result = DigestUtils。md5DigestAsHex(base。getBytes());System。out。println(result);

pythonimport hashlibm = hashlib。md5()m。update(b‘hello’)result = m。hexdigest()

c# using System。Security。Cryptography;using System;using System。Text;namespace test。md5{ public static void Main(string[] args)        {            string str = “hello”;            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();            byte[] bytValue, bytHash;            bytValue = System。Text。Encoding。UTF8。GetBytes(str);            bytHash = md5。ComputeHash(bytValue);            Console。WriteLine(bytHash。Length);            StringBuilder sBuilder = new StringBuilder();            for (int i = 0; i < bytHash。Length; i++)            {                sBuilder。Append(bytHash[i]。ToString(“x2”));                Console。WriteLine(bytHash[i]);            }            md5。Clear();            Console。WriteLine(sBuilder);        }}