我不是高手,我只是一個普通的程式設計師,我特別願意大家留言討論,批評指正,您給我指正了,我就去查資料,去做實驗,我技術就能得到提高,我認為這是一個程式設計師的基本素養。
序言
:程式設計師在實際的開發中會或多或少地用到一些加密的演算法,如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
windows下執行
CertUtil -hashfile aaa。txt 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); }}