一、數據加密
-
加密
數據加密就是將明文的數據按照某種算法進行處理,使其成為不可讀的數據,通常稱為“密文”。用於保護數據不被其他人非法竊取、閱讀。
-
解密
加密的逆過程為解密,即將該編碼信息轉化為其明文數據的過程。
- 常見的加密算法可以分為:對稱加密算法、非對稱加密算法。
1、對稱加密算法
數據的加密和解密使用相同的密鑰,在密碼學中被稱為對稱加密算法。對稱加密算法實現簡單,密鑰較短,且破譯困難,是最初的加密算法。
特點:
- 優點:算法公開、計算量小、加密速度快、加密效率高。
- 缺點:在數據傳輸前,發送方和接收方必須約定並管理保存好秘鑰,如果一方的秘鑰被泄露,那么加密信息就存在安全泄露。
- 使用場景:本地數據加密、https通信、網絡傳輸等。
- 常見算法:AES、DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6。
2、非對稱加密算法
非對稱加密算法思想為“加密和解密可以使用不同的規則,只要這兩種規則之間存在某種對應關系",該類算法使用一對公鑰/私鑰完成數據的加密解密過程。
通常:
- 使用公鑰對數據進行加密,使用對應的私鑰進行解密。
- 使用私鑰對數據進行加密,使用對應的公鑰進行解密。
特點:
- 優點:非對稱加密相比對稱加密其安全性更好。
- 缺點:加密和解密花費時間長、速度慢,只適合對少量數據進行加密。
- 使用場景:https會話前期、CA數字證書、信息加密、登錄認證等。
- 常見算法:RSA、DSA(數字簽名用)、ECC(移動設備用)、Diffie-Hellman、ElGamal。
3、加密算法的選擇
- 對稱加密算法不能實現數字簽名,因此簽名只能非對稱算法。
- 驗證文件或字符一致性用信息摘要算法。
- 數據量大用對稱加密算法、小則可以用非對稱加密。
- 還可以非對稱與對稱集成使用,參考https請求原理。
- RSA建議采用1024位的數字,ECC建議采用160位,AES采用128為即可。
二、數據摘要
信息摘要:對數據進行處理,取得一段固定長度的文本。
數據摘要算法也被稱為哈希(Hash)算法、散列算法。哈希算法是一種單向算法,用戶可以通過Hash算法對目標信息生成一段特定長度的唯一的Hash值,卻不能通過這個Hash值重新獲得目標信息。因此,Hash算法常用在不可還原的密碼存儲、信息完整性校驗等場景。
一般在進行數字簽名時,需要先對文本使用HASH算法計算其信息摘要,然后對該摘要值進行數字簽名。
- 優點:
- 輸出長度固定。即輸出長度和輸入長度無關。
- 不可逆。即由輸出數據理論上不能推導出輸入數據。(通常加鹽值保證不可逆)
- 對輸入數據敏感。當輸入數據變化極小時,輸出數據也會發生明顯的變化。
- 防碰撞。即不同的數據數據得到相同輸出數據的可能性極低。
- 摘要運算得到的數據大小通常相比於原文較小,有數據壓縮的作用。
由於信息摘要具有上述特點,一般保證數據的完整性,對一個大文件進行摘要運算,得到其摘要值。通過網絡或者其他渠道傳輸后,通過驗證其摘要值,確定大文件本身有沒有發生變化。(常見文件MD5值的應用)
- 缺點:可能存在散列沖突。
- 使用場景:文件或字符串一致性校驗、數字簽名、鑒權協議。
- 常見算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。
常見算法分類:
- MD<n>系列
這是應用非常廣泛的一個算法家族,尤其是 MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由MD2、MD3、MD4發展而來,由Ron Rivest(RSA公司)在1992年提出,被廣泛應用於數據完整性校驗、數據(消息)摘要、數據加密等。MD2、MD4、MD5 都產生16字節(128位)的校驗值,一般用32位十六進制數表示。MD2的算法較慢但相對安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。在互聯網上進行大文件傳輸時,都要得用MD5算法產生一個與文件匹配的、存儲MD5值的文本文件(后綴名為 .md5或.md5sum),這樣接收者在接收到文件后,就可以利用與 SFV 類似的方法來檢查文件完整性,絕大多數大型軟件公司或開源組織都是以這種方式來校驗數據完整性,而且部分操作系統也使用此算法來對用戶密碼進行加密,另外,它也是目前計算機犯罪中數據取證的最常用算法。
- SHA<n>系列
安全哈希算法(Secure Hash Algorithm)主要適用於數字簽名標准(Digital Signature Standard DSS)里面定義的數字簽名算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。該算法經過加密專家多年來的發展和改進已日益完善,並被廣泛使用。該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),並把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。散列函數值可以說是對明文的一種“指紋”或是“摘要”所以對散列值的數字簽名就可以視為對此明文的數字簽名。
SHA系列算法的摘要長度分別為:SHA1為20字節(160位)、SHA224為28字節(224位)、SHA256為32字節(256位)、 SHA384為48字節(384位)、SHA512為64字節(512位),由於它產生的數據摘要的長度更長,因此更難以發生碰撞,因此也更為安全,它是未來數據摘要算法的發展方向。由於SHA系列算法的數據摘要長度較長,因此其運算速度與MD5相比,也相對較慢。
- CRC<n>系列
- RIPEMD、PANAMA、TIGER、ADLER32 等。
三、數字簽名
數據簽名又稱為數據加簽。
簽名,即自己寫自己的名字,尤其為表示同意、認可、承擔責任或義務。在實際生活中,一些方式(如字跡,指紋等)一直被用作簽名者身份的證明。簽名是可信的具有如下特點:不可偽造的;不可重用的;不可抵賴的。簽名即代表着同意,並產生法律效力,在法律上賦予了文件以真實性。
數字簽名,簡單來說就是通過提供可鑒別的數字信息驗證自身身份的一種方式。一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。分別由發送者持有能夠代表自己身份的私鑰 ,由接受者持有與私鑰對應的公鑰 ,能夠在接受到來自發送者信息時用於驗證其身份。
1、特點:
- 防冒充
其他人不能偽造對消息的簽名,因為私有密鑰只有簽名者自己知道,所以其他人不能偽造出正確的簽名結果。要求私鑰的持有人保存好自己的私鑰。
- 防篡改
對於數字簽名,簽名和原有文件己經形成一個混合的整體數據,不能篡改,從而保證了數據的完整性。
- 防重放
在數字簽名中,如果采用了對簽名報文添加流水號、時戳等技術,可以防止重放攻擊.
- 防抵賴
數字簽名可以鑒別身份,不可能冒充偽造。簽名者無法對自己作過的簽名抵賴。要防止接收者的抵賴,在數字簽名體制中,要求接收者返回一個自己簽名的表示收到的報文,給對方或者是第三方,或者引入第三方仲裁機制。這樣,雙方均不可抵賴。
- 機密性
有了機密性的保證,截取攻擊就不會成功了。對要簽名的消息進行適合的加密操作來保證機密性,這些涉及到加密或簽密理論。
2、數字簽名原理
- 可以理解:用戶認證,用來驗證用戶身份,用來確保信息發布人的身份和信息的完整性。
- 數字簽名過程:
- 將報文按雙方約定的HASH算法計算得到一個固定位數的報文摘要。在數學上保證,只要改動報文中任何一位,重新計算出的報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。
- 將該報文摘要值用發送者的私人密鑰加密即稱數字簽名,然后連同原報文和數字證書(包含公鑰)一起發送給接收者。
- 接收方收到數字簽名后,用同樣的HASH算法對報文計算摘要值,然后將數字簽名用發送者的公鑰進行解簽,並與報文摘要值相比較,如相等則說明報文確實來自所稱的發送者。
上述過程可以借用下圖完美詮釋:
為了防止公鑰在傳輸過程中被調包,需要證書中心(簡稱CA)為公鑰做認證。證書中心用自己的私鑰,對公鑰和一些相關信息一起加密,生成"數字證書"(Digital Certificate),客戶端用CA的公鑰解開數字證書,從而確定公鑰的真實性。
3、數字簽名算法
- RSA
RSA是目前計算機密碼學中最經典算法,也是目前為止使用最廣泛的數字簽名算法,RSA數字簽名算法的密鑰實現與RSA的加密算法是一樣的,算法的名稱都叫RSA。密鑰的產生和轉換都是一樣的,包括在售的所有SSL數字證書、代碼簽名證書、文檔簽名以及郵件簽名大多都采用RSA算法進行加密。
RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰數據加密標准。
RSA算法支持公鑰加密、私鑰解密以及私鑰加密、公鑰解密。
但是RSA數字簽名算法存在簽名易被偽造和計算時間長的弱點,因此實際對文件簽名前,需要對消息經單向散列函數計算其消息摘要。
比如 MD5withRSA 是將正文通過MD5消息摘要后,將其再次通過RSA密鑰加密,生成數字簽名。
具體消息摘要算法結合RSA算法的選擇如下表格所示:
- DSA
DSA全稱Digital Signature Algorithm,DSA只是一種算法,和RSA不同之處在於它不能用作加密和解密,也不能進行密鑰交換,只用於簽名,所以它比RSA要快很多,其安全性與RSA相比差不多。
那么簽名算法與公鑰加密算法的區別是什么呢?
簽名算法,用來確保信息發布人的身份和信息的完整性,不能用來做加密傳輸,為了實現這個功能,信息的原文(或者消息摘要)必須隨着簽名一起傳輸和公布才能被驗證。而 RSA 是公鑰加密體系,它可以用來加密傳輸(即信息原文在傳輸中加密,到達對方后解密),它也可以實現簽名驗證。
具體消息摘要算法結合DSA算法的選擇如下表格所示:
- ECDSA
橢圓曲線數字簽名算法 ECDSA 是使用橢圓曲線密碼 ECC 對數字簽名算法 DSA 的模擬。ECDSA 於1999年成為 ANSI 標准,並於2000年成為 IEEE 和 NIST 標准。它在1998年既已為ISO所接受,並且包含它的其他一些標准亦在ISO的考慮之中。
比特幣所使用的數字簽名算法就是橢圓曲線數字簽名算法。
ECC 與 RSA 相比,有以下的優點:
(1)相同密鑰長度下,安全性能更高,如160位ECC已經與1024位RSA、DSA有相同的安全強度。
(2)計算量小,處理速度快,在私鑰的處理速度上(解密和簽名),ECC遠 比RSA、DSA快得多。
(3)存儲空間占用小 ECC的密鑰尺寸和系統參數與RSA、DSA相比要小得多, 所以占用的存儲空間小得多。
(4)帶寬要求低使得ECC具有廣泛得應用前景。
具體消息摘要算法結合ECDSA算法的選擇如下表格所示:
四、應用
1、報文傳輸
前后端數據報文交互或者外部系統對接通常采用加密加簽方式實現數據安全。公鑰一般用來加密,私鑰用來簽名。
- 關於作用
示例:A->B:
- A對信息簽名的作用是確認這個信息是A發出的,不是別人發出的;(用戶認證)
- A對信息加密主要是保證信息內容不會被其他人獲取,只有B可以獲取。
簡而言之,加密加簽保證端到端整個過程的唯一確定性,這個信息是A發出的(不是別人),且是發給B的,只有B才被獲得具體內容(別人就算截獲信息也不能獲得具體內容)。
- 關於密鑰
整個端對端過程會涉及兩組四個密鑰:
A的公鑰(PUB_A),A的私鑰(PRI_A);
B的公鑰(PUB_B),B的私鑰(PRI_B)。
通常:公鑰是公開給別人的,私鑰只能自己私密持有(不可泄露),且公鑰和私鑰唯一對應使用。
示例:A->B,加簽加密:
- A先用自己的私鑰(PRI_A)對信息(一般是信息的摘要)進行簽名。(通常先信息摘要再加簽)
- A接着使用B的公鑰(PUB_B)對信息內容和簽名信息進行加密。
示例:B獲取A信息內容,解密驗簽:
- 用自己的私鑰(PRI_B)解密A用B的公鑰(PUB_B)加密的內容;
- 得到解密后的明文后用A的公鑰(PUB_A)驗簽A用A自己的私鑰(PRI_A)的簽名。
從而,整個過程就保證了端到端的唯一確認。A的簽名只有A的公鑰才能驗簽,這樣B就能確認這個信息是A發來的;A的加密只有B的私鑰才能解密,這樣A就能確認這份信息只能被B讀取。
- 常見應用:SHA1WithRSA+AES
SHA1WithRSA實現報文非業務參數列表加簽/驗簽(報文非業務參數列表生成的混合字符串&),AES實現報文業務參數加密/解密(接口業務參數對象JSON字符串)。
SHA1WithRSA:
SHA1WithRSA將報文接口參數混合字符串通過SHA1信息摘要之后,將其再次通過RSA私鑰加密,生成數字簽名,即:加簽。(先壓縮,再非對稱加密,效率更高)
如果請求參數數據量較少,可以不用考慮數據壓縮(數據摘要),采用:RSA加簽/驗簽,AES加密/解密。
整個端對端過程需要:
- RSA算法,用於加簽驗簽。
- SHA1WithRSA算法,用於先信息摘要后加簽驗簽,依賴於RSA算法密鑰對。
- AES算法,加密解密。
2、密碼傳輸
密碼為敏感數據,對於密碼數據的傳遞通常采用組合加密技術,即:采用對稱算法加密數據,再采用非對稱算法管理對稱算法的秘鑰。
- 常見應用:AES+RSA
發送請求:
- 生成RSA密鑰對:公鑰和私鑰。服務請求方保留公鑰,接收方保留私鑰。
- 請求方隨機生成AES秘鑰(KEY)。
- 請求方用AES密鑰對密碼數據進行加密。
- 請求方用RSA公鑰對AES密鑰進行加密。
- 將加密后的密文和加密后的AES密鑰發送給接收方。
- 接收方用RSA私鑰對加密后的AES密鑰進行解密,獲得真實的AES密鑰。
- 接收方用真實的AES密鑰對密文進行解密,得到密碼明文。
返回響應:
通過發送請求過程,請求方和接收方都獲得相同的AES密鑰(KEY),在數據回傳時,只需要將原文使用AES密鑰加密,回傳給請求方即可。
3、密碼存儲
根據摘要算法的不可逆、獲得摘要信息更小特征,因此通常采用摘要算法(哈希算法)SHA256對密碼數據加密存儲入庫。
典例:用戶編號userNo + 加鹽值的密碼混合字符串--->采用SHA256加密,再存儲到數據庫。
加鹽值:主要為了增加破解的難度,降低破解的可能性。
五、參考