本篇主要介紹筆者在iOS開發(fā)工作中用到的加解密算法的使用,主要包括:
1)對(duì)稱加密算法:AES、DES、3DES
2)非對(duì)稱加密算法:RSA、DSA、ECC
3)哈希(散列)函數(shù)(消息摘要算法):MD5、SHA1、SHA256、MurmurHash
4)編碼方式:Base64、Base58
5)蘋果原生加密相關(guān)算法的系統(tǒng)庫(kù):CommonCrypto、Security、CryptoKit
在講解每一種加解密算法的使用時(shí),筆者都會(huì)盡可能的附上相應(yīng)的代碼,希望能讓讀者更容易理解或直接用于項(xiàng)目中。如有疑問(wèn)歡迎留言探討。
本篇對(duì)應(yīng)的Deom地址:https://github.com/zhoushejun/SJSecurity,歡迎Star。
APP內(nèi)的數(shù)據(jù)安全是非常重要的一部分,尤其是對(duì)用戶的隱私數(shù)據(jù)的保護(hù)。在我們的日常開發(fā)工作中,需要對(duì)應(yīng)用中的多項(xiàng)數(shù)據(jù)進(jìn)行加解密處理,但從性能與安全性方面考慮,可能會(huì)使用一種或多種不同的加解密算法。
一、對(duì)稱加密算法
基本概念:指加密和解密使用相同密鑰的加密算法,也叫私鑰加密。
嚴(yán)格來(lái)講不一定是相同的密鑰,滿足以下條件也是對(duì)稱加密:加密密鑰能夠從解密密鑰中推算出來(lái),同時(shí)解密密鑰也可以從加密密鑰中推算出來(lái)。但在大多數(shù)的對(duì)稱加密算法中,加密密鑰和解密密鑰是相同的。
優(yōu)點(diǎn):算法公開,計(jì)算量小,加解密速度快、效率高。
缺點(diǎn):對(duì)稱加密算法的安全性取決于加密密鑰的保存情況,安全性得不到保證。
常用算法:AES、DES、3DES
AES:高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard),是現(xiàn)在公認(rèn)的最安全的加密方式,是對(duì)稱密鑰加密中最流行的算法。蘋果的鑰匙串訪問(wèn)采用的就AES加密。AES有兩種常用的加密模式:
ECB模式:電子密碼本(Electronic Code Book Mode),加密文件會(huì)被分為若干個(gè)加密塊,每個(gè)塊都是獨(dú)立進(jìn)行加密,無(wú)初始向量,相同的明文將永遠(yuǎn)加密成相同的密文。容易受到密碼本重放攻擊,一般情況下很少用。
CBC模式:密碼塊鏈(Cipher Block Chaining Mode),使用一個(gè)密鑰和一個(gè)初始化向量(IV)對(duì)數(shù)據(jù)執(zhí)行加密轉(zhuǎn)換。加密文件同樣會(huì)被分為若干個(gè)加密塊,每個(gè)塊都依賴于上一個(gè)加密塊進(jìn)行加密,明文被加密前要與前面的密文進(jìn)行異或運(yùn)算后再加密,因此只要選擇不同的初始向量,相同的明文加密后會(huì)形成不同的密文,這是目前應(yīng)用最廣泛的模式。CBC加密后的密文是上下文相關(guān)的,但明文的錯(cuò)誤不會(huì)傳遞到后續(xù)分組,但如果一個(gè)分組丟失,后面的分組將全部作廢(同步錯(cuò)誤)。
DES:數(shù)據(jù)加密標(biāo)準(zhǔn),加密強(qiáng)度不夠,能夠暴力破解。筆者開發(fā)中未曾使用。
3DES:使用3個(gè)密鑰對(duì)相同的數(shù)據(jù)執(zhí)行3次加密,增強(qiáng)加密強(qiáng)度。但需要維護(hù)3個(gè)密鑰,維護(hù)成本大。筆者開發(fā)中也未曾使用。
CommonCrypto庫(kù):蘋果提供的系統(tǒng)加密庫(kù),有原生的對(duì)稱加密算法和Hash算法,支持iOS和Mac開發(fā)。其支持加密算法有:AES、DES、3DES、CAST、RC2、RC4、Blowfish、MD5、SHA1/224/256/384/512等加密算法。其中AES、DES、3DES、CAST、RC2、Blowfish等6種為分組加密算法,RC4為流加密算法。
AES加解密算法:

二、非對(duì)稱加密算法
基本概念:指加密和解密使用不同密鑰的加密算法,也稱為公私鑰加密。
優(yōu)點(diǎn):公鑰是公開的,私鑰是自己保存的,不需要將私鑰給別人,安全性更高。
缺點(diǎn):加解密花費(fèi)時(shí)間長(zhǎng)、速度慢,只適合對(duì)少量數(shù)據(jù)進(jìn)行加密。加解密速度要遠(yuǎn)遠(yuǎn)慢于對(duì)稱加密。
常用算法:RSA、DSA、ECC
Security.framework:蘋果提供的系統(tǒng)加密庫(kù),支持iOS和Mac開發(fā)。需要了解這庫(kù)里的兩個(gè)結(jié)構(gòu)體:
SecPadding:創(chuàng)建或驗(yàn)證數(shù)字簽名時(shí)使用的填充類型。。
SecKeyAlgorithm:對(duì)SecKey對(duì)象執(zhí)行加密操作的可用算法。其支持的算法有:RSA、ECDSA、ECIES、ECDH等算法。
RSA:該算法由3位麻省理工學(xué)院的數(shù)學(xué)家“羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)”一起設(shè)計(jì)的,可以實(shí)現(xiàn)非對(duì)稱加密。所以用他們?nèi)齻€(gè)人的名字命名,叫RSA算法。歐拉定理是RSA算法的核心,理解了這個(gè)定理,就可以理解RSA。主要了解公私鑰的生成、公鑰加密、私鑰解密、私鑰簽名、公鑰驗(yàn)簽、讀取證書信息,以及在Keychain中存儲(chǔ)、查找、刪除密鑰等功能。
ECDSA:橢圓曲線數(shù)字簽名算法(ECDSA)是使用橢圓曲線密碼(ECC)對(duì)數(shù)字簽名算法(DSA)的模擬,是一種數(shù)字簽名算法。
ECDH:ECC算法和DH結(jié)合使用,用于密鑰磋商,這個(gè)密鑰交換算法稱為ECDH。交換雙方可以在不共享任何秘密的情況下協(xié)商出一個(gè)密鑰。ECC是建立在基于橢圓曲線的離散對(duì)數(shù)問(wèn)題上的密碼體制,給定橢圓曲線上的一個(gè)點(diǎn)P,一個(gè)整數(shù)k,求解Q=kP很容易;給定一個(gè)點(diǎn)P、Q,知道Q=kP,求整數(shù)k確是一個(gè)難題。ECDH是安全密鑰交換算法。
ECIES:是一種集成加密方案。ECIES加密可以認(rèn)為是先基于ECDH協(xié)商密鑰,再用剛剛協(xié)商一致的密鑰進(jìn)行對(duì)稱加密,這樣能夠結(jié)合非對(duì)稱加密和對(duì)稱加密的優(yōu)點(diǎn)。
1)RSA生成密鑰對(duì)算法:

2)RSA加解密算法:

擴(kuò)展:根據(jù)官方資料顯示,上圖中的加解密算法加密的文本長(zhǎng)度是受限制的。RSA加解密為塊加密算法( block cipher algorithm),在固定長(zhǎng)度的數(shù)據(jù)塊上進(jìn)行操作。 block length是跟key length 以及所使用的填充模式相關(guān):
Raw模式:要加密的數(shù)據(jù)塊長(zhǎng)度 <= SecKeyGetBlockSize(:)
PKCS1模式:要加密的數(shù)據(jù)塊長(zhǎng)度 <= SecKeyGetBlockSize(:)-11。(Public Key Cryptography Standards)
OAEPX模式:要加密的數(shù)據(jù)塊長(zhǎng)度 <= SecKeyGetBlockSize(:)-42/58/66/98/130。(Optimal Asymmetric Encryption Padding)
RSA加密的兩種算法分別是RSAES-PKCS-v1_5 and RSAES-OAEP。這里有必要了解一下加密算法參數(shù)algorithm的各種值的意義,在實(shí)際情況下才能根據(jù)需要使用:
rsaEncryptionRaw:原始的RSA加密或解密,數(shù)據(jù)的大小必須符合RSA密鑰的模數(shù)大小。直接不使用填充的算法在密碼學(xué)上是非常弱的。輸入數(shù)據(jù)大小必須小于或等于key length大小,并且返回的塊大小總是與SecKeyGetBlockSize()返回的塊大小相同。
rsaEncryptionPKCS1:RSA加密或解密,數(shù)據(jù)填充使用PKCS#1填充方案。此算法僅用于與現(xiàn)有協(xié)議和數(shù)據(jù)的向后兼容,筆者不建議再使用這個(gè)填充方案的加密算法。建議選擇更強(qiáng)的加密算法(參見rsaEncryptionOAEP)。輸入數(shù)據(jù)最多只能是“SecKeyGetBlockSize() - 11”bytes字節(jié)長(zhǎng),并且返回的塊大小總是與SecKeyGetBlockSize()返回的塊大小相同。
rsaEncryptionOAEP(SHAX)系列:SHAX系列包括-SHA1(-42)、SHA224(-58)、SHA256(-66)、SHA384(-98)、SHA512(-130)。RSA加密或解密,使用OAEP填充方案填充的數(shù)據(jù),其內(nèi)部使用SHAX哈希算法。輸入數(shù)據(jù)最多只能是“SecKeyGetBlockSize()- 42/58/66/98/130”bytes字節(jié)長(zhǎng),并且返回的塊大小總是與SecKeyGetBlockSize()返回的塊大小相同。使用對(duì)應(yīng)的算法:rsaEncryptionOAEPSHAXAESGCM能夠加密和解密任意長(zhǎng)的數(shù)據(jù)。
rsaEncryptionOAEP(SHAXAESGCM)系列:使用OAEP填充方案,由RSA加密隨機(jī)生成的AES會(huì)話密鑰。在GCM模式下,使用全部為0的16字節(jié)長(zhǎng)IV(初始化向量)的會(huì)話密鑰對(duì)用戶數(shù)據(jù)進(jìn)行加密。最后,將16字節(jié)的AES-GCM標(biāo)記附加到密文后。如果RSA密鑰為4096bit或更大,則使用256bit長(zhǎng)的AES密鑰,否則使用128bit長(zhǎng)的AES密鑰。原始public key公鑰數(shù)據(jù)用作AES-GCM加密的身份驗(yàn)證數(shù)據(jù)。
這里需要了解一個(gè)問(wèn)題:什么是AES-GCM?待完善。。。
3)RSA簽名與驗(yàn)簽算法:

擴(kuò)展:目前主流的RSA簽名方式包括RSA-PSS和RSA-PKCS,簽名過(guò)程包括hash和加密。
PSS: (Probabilistic Signature Scheme)私鑰簽名流程的一種填充模式。相對(duì)應(yīng)PKCS是一種能夠自我從簽名中恢復(fù)原來(lái)的簽名,而PSS無(wú)法從簽名中恢復(fù)原來(lái)的簽名。openssl-1.1.x以后默認(rèn)在ssl握手的server key exchange階段使用更安全的PSS的RSA簽名模式。
PKCS1:(Public Key Cryptography Standards)
PKCS1SHAX:選擇對(duì)應(yīng)的SHA1/224/256/384/512哈希算法把要簽名的數(shù)據(jù)轉(zhuǎn)換后成標(biāo)準(zhǔn)的“ASN.1”格式的數(shù)據(jù)后,再用private key按PKCS數(shù)據(jù)填充模式對(duì)這個(gè)數(shù)據(jù)進(jìn)行加密。
問(wèn)題1:為什么RSA簽名要引入模式?
因?yàn)镽SA算法沒有加入亂數(shù),TLS流程中的密鑰材料若不進(jìn)行填充而直接加密,那么顯然相同的key,會(huì)得到相同的密文。這種在語(yǔ)義上來(lái)說(shuō),當(dāng)出現(xiàn)重復(fù)性的原始資料,攻擊者會(huì)通過(guò)相同加密密文而猜測(cè)出原文,這是不安全的。因此導(dǎo)入padding的機(jī)制來(lái)加強(qiáng)安全性。
4)讀取本地證書公私鑰算法




擴(kuò)展:證書相關(guān)的一些概念或操作
SSL/TLS:Secure Sockets Layer (安全套接層協(xié)議)/Transport Layer Security (傳輸層安全)。TLS協(xié)議包括兩層:TLS記錄和TLS握手協(xié)議,SSL/TLS 握手是為了安全地協(xié)商出一份對(duì)稱加密的密鑰??梢酝ㄟ^(guò)Wireshark 抓包工具查看在TLS的握手過(guò)程中的各種參數(shù)。
SSL/TLS協(xié)議的基本過(guò)程:
1)客戶端向服務(wù)器端索要并驗(yàn)證公鑰。
2)雙方協(xié)商生成會(huì)話密鑰,也叫“共享密鑰”、“公共密鑰”。
3)雙方采用會(huì)話密鑰進(jìn)行加密通信。
OpenSSL:Open Secure Sockets Layer(開放式安全套接層協(xié)議),是一個(gè)開放源代碼的軟件庫(kù)包。主要功能包括:SSL協(xié)議庫(kù)、應(yīng)用程序以及密碼算法庫(kù)等3個(gè)部分,囊括了主要的密碼算法、常用的密鑰和證書封裝管理功能以及SSL協(xié)議,并提供了豐富的應(yīng)用程序供測(cè)試或其它目的使用。
OpenSSL實(shí)現(xiàn)的算法:
8種對(duì)稱加密算法:AES、DES、CAST、RC2、RC4、RC5、Blowfish、IDEA。
4種非對(duì)稱加密算法:DH、RSA、DSA、ECC。
6種信息摘要算法:MD2、MD5、MDC2、SHA(SHA1)、RIPEMD、DSS(DSS1)。
X.509:密碼學(xué)里公鑰證書的格式標(biāo)準(zhǔn),即證書標(biāo)準(zhǔn),主要定義了證書中應(yīng)該包含哪些內(nèi)容。
證書的編碼格式:
PEM:ASCII格式。Privacy Enhanced Mail(隱私增強(qiáng)型電子郵件),DER編碼的證書再進(jìn)行Base64編碼后的數(shù)據(jù),打開看文本格式,以“-----BEGIN CERTIFICATE-----”開頭,“-----END CERTIFICATE-----”結(jié)尾。
DER:二進(jìn)制格式。Distinguished Encoding Rules,打開看是二進(jìn)制格式,不可讀,但Base64編碼后也很常見。
證書的擴(kuò)展名:
.pem:見編碼格式。
.crt:證書可以被編碼為二進(jìn)制DER或ASCII PEM。 cer和crt擴(kuò)展幾乎是同義詞。
.cer: .crt的替代形式。
.der:見編碼格式。
.p7b,.p7c:PKCS#7格式,簽名的數(shù)據(jù)結(jié)構(gòu)沒有數(shù)據(jù),只有證書或URL。
.pfx:PKCS#12之前的格式(通常用PKCS#12格式,比如那些由IIS產(chǎn)生的PFX文件)。
.p12:PKCS#12格式,二進(jìn)制格式,包含證書的同時(shí)可能還有帶密碼保護(hù)的私鑰。
前向保密性:Forward Secrecy,將來(lái)任何加密密鑰的披露都無(wú)法解密過(guò)去的任何記錄。
5)Keychain密鑰操作
待完善。。。
擴(kuò)展:把公鑰和私鑰信息保存到Keychain里面。
6)ECDSA
擴(kuò)展:ECDSA(Elliptic Curve Digital Signature Algorithm) 是橢圓曲線數(shù)字簽名算法,是 DSA 作用于橢圓曲線的一個(gè)變種算法,是使用橢圓曲線密碼(ECC)對(duì)數(shù)字簽名算法(DSA)的模擬。ECDSA 需要使用明文的哈希結(jié)果,而不是明文本身。哈希函數(shù)的選擇取決于使用者,但是需要明確的是必須選擇加密安全的哈希函數(shù)。對(duì)于相同的安全級(jí)別,ECDSA密鑰和簽名比RSA中的短,256-bit的ECDSA簽名具有與3072-bit的RSA簽名相同的安全強(qiáng)度。
7)DH、ECDH、X3DH
擴(kuò)展:
DH:Diffie-Hellman密鑰交換協(xié)議/算法(Diffie-Hellman Key Exchange/Agreement Algorithm),DH密鑰交換是一種安全協(xié)議。它可以讓雙方在完全沒有對(duì)方任何預(yù)先信息的條件下通過(guò)不安全信道創(chuàng)建起一個(gè)密鑰。這個(gè)密鑰可以在后續(xù)的通訊中作為對(duì)稱密鑰來(lái)加密通訊內(nèi)容。公鑰交換的概念最早由瑞夫·墨克提出,而這個(gè)密鑰交換方法,由惠特菲爾德·迪菲和馬丁·赫爾曼在1976年首次發(fā)表。 DH密鑰交換的同義詞包括: DH密鑰協(xié)商、DH密鑰創(chuàng)建、指數(shù)密鑰交換、DH協(xié)議。雖然DH密鑰交換本身是一個(gè)匿名的密鑰交換協(xié)議,它卻是很多認(rèn)證協(xié)議的基礎(chǔ),并且被用來(lái)提供傳輸層安全協(xié)議的短暫模式中的前向安全性。DH密鑰交換協(xié)議/算法只能用于密鑰的交換,而不能進(jìn)行消息的加密和解密。雙方確定要用的密鑰后,要使用其他對(duì)稱密鑰操作加密算法實(shí)現(xiàn)加密和解密消息。DH與RSA的不同之處在于,DH不是加密算法,它只是生成可用作對(duì)稱密鑰的秘密數(shù)值。在DH密鑰交換過(guò)程中,發(fā)送方和接收方分別生成一個(gè)秘密的隨機(jī)數(shù),并根據(jù)隨機(jī)數(shù)推導(dǎo)出公開值,然后,雙方再交換公開值。DH算法的基礎(chǔ)是具備生成共享密鑰的能力。只要交換了公開值,雙方就能使用自己的私有數(shù)和對(duì)方的公開值來(lái)生成對(duì)稱密鑰,稱為共享密鑰,對(duì)雙方來(lái)說(shuō),該對(duì)稱密鑰是相同的,可以用于使用對(duì)稱加密算法加密數(shù)據(jù)。
ECDH:本質(zhì)是密鑰協(xié)商協(xié)議,是橢圓曲線的Diffie-Hellman算法的一種變體,而不僅僅是加密算法。從根本上講,這意味著ECDH在一定程度上定義了各方之間如何生成和交換密鑰。如何使用這些密鑰加密數(shù)據(jù)取決于通信雙方。常用來(lái)做ECDH密鑰交換的橢圓曲線Curve25519和Curve448,也用來(lái)做數(shù)字簽名。
為什么Curve25519和Curve448的公私鑰對(duì)可以用來(lái)做數(shù)字簽名?
Ed25519,Ed448和Curve25519和Curve448的差異,這兩者分別是曲線的不同表達(dá)形式,一個(gè)是 Twisted Edwards曲線(適合做簽名曲線) ,一個(gè)是Montgomery曲線(適合做DH曲線),兩者之間可以相互轉(zhuǎn)化(一個(gè)曲線上的點(diǎn)可以對(duì)應(yīng)到另外一個(gè)曲線上的點(diǎn)),這也是為什么Curve25519和Curve448的公私鑰對(duì)可以用來(lái)做數(shù)字簽名。
X3DH:是ECDH的擴(kuò)展,用來(lái)在通信雙方之間建立共享密鑰。相比ECDH,它最大的不同就是引入了第三方服務(wù)器的角色,使得X3DH可以實(shí)現(xiàn)某一方在離線的時(shí)候也可以進(jìn)行密鑰交換來(lái)建立共享密鑰,同時(shí)根據(jù)用戶唯一的身份密鑰提供身份認(rèn)證,以及前向安全性。為了實(shí)現(xiàn)上述的功能,需要用戶提前在服務(wù)器存儲(chǔ)自己的身份密鑰IK,帶簽名的預(yù)存密鑰SPK,以及一組一次性密鑰OPK。把以上密鑰上傳到第三方服務(wù)器后,其他用戶就可以根據(jù)這些密鑰異步地和該用戶協(xié)商共同密鑰,而不需用戶保持在線。協(xié)商密鑰的消息上傳到服務(wù)器,等用戶上線的時(shí)候再去獲取計(jì)算共同密鑰。
8)ECC
擴(kuò)展:ECC(Elliptic Curve Cryptography)橢圓加密算法是一種基于橢圓曲線數(shù)學(xué)的公開密鑰加密算法,是一種公鑰加密體制,其數(shù)學(xué)基礎(chǔ)是利用橢圓曲線上的有理點(diǎn)構(gòu)成Abel加法群上橢圓離散對(duì)數(shù)的計(jì)算困難性。公鑰密碼體制根據(jù)其所依據(jù)的難題一般分為三類:大素?cái)?shù)分解問(wèn)題類、離散對(duì)數(shù)問(wèn)題類、橢圓曲線類。有時(shí)也把橢圓曲線類歸為離散對(duì)數(shù)類。
9)HKDF
擴(kuò)展:HMAC-based KDF(Key Derivation Function),基于HMAC的密鑰推導(dǎo)函數(shù)(也叫密鑰派生函數(shù))。HKDF算法是TLS1.3中關(guān)于密鑰生成的重要的基礎(chǔ)算法,跟密鑰推導(dǎo)密切相關(guān)。HKDF根據(jù)初始獲取的一些密鑰材料,從中派生出一個(gè)或多個(gè)安全強(qiáng)度很大的密鑰。用法詳見第三方庫(kù) **HKDFKit **地址:https://github.com/WhisperSystems/HKDFKit.git
10)Curve25519
擴(kuò)展:Curve25519是目前最高水平的Diffie-Hellman函數(shù)。給定用戶的32字節(jié)密鑰和另一個(gè)用戶的32字節(jié)公共密鑰,Curve25519計(jì)算兩個(gè)用戶共享的32字節(jié)密鑰即共享密鑰。然后,在這兩個(gè)用戶之間可以用這個(gè)共享密鑰進(jìn)行身份驗(yàn)證和加密消息。用法詳見第三方庫(kù) **Curve25519Kit **地址:https://github.com/WhisperSystems/Curve25519Kit
三、哈希(散列)函數(shù)(消息摘要算法)
基本概念:哈希函數(shù),又稱散列函數(shù)、散列算法,是一種從任何數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定下來(lái)。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個(gè)叫做散列值(或哈希值)的指紋。散列值通常用一個(gè)短的隨機(jī)字母和數(shù)字組成的字符串來(lái)代表。
哈希函數(shù)分:非加密哈希函數(shù)、加密哈希函數(shù)。
第一代非加密哈希函數(shù)代表:lookup3,大約為0.5 bytes/cycle,于2006年由Bob Jenkins(人名)發(fā)布。
第二代非加密哈希函數(shù)代表:MurmurHash,大約是lookup3速度的2倍(大約為1 byte/cycle),當(dāng)前的版本是MurmurHash3, 能夠產(chǎn)生出32-bit或128-bit哈希值。
第三代非加密哈希函數(shù)代表:CityHash 和 SpookyHash。于2011年Google發(fā)布了CityHash,Bob Jenkins發(fā)布了SpookyHash。它們都擁有2倍于MurmurHash的速度,但它們都只使用了64位數(shù)學(xué)函數(shù)而沒有32位版本,并且CityHash的速度取決于CRC32 指令。SpookyHash給出128位輸出,而CityHash有64位,128位以及256位等幾個(gè)變種。
以上三代非加密散列函數(shù)用的最多的地方是Hash Table。
MD5(Message - Digest Algorithm 5):MD5是一種被廣泛使用的密碼散列函數(shù),由MD4、MD3、MD2改進(jìn)而來(lái),主要增強(qiáng)算法復(fù)雜度和不可逆性,可以產(chǎn)生出一個(gè)128bit(16bytes)的散列值(hash value),用于確保信息傳輸完整一致。因其普遍、穩(wěn)定、快速的特點(diǎn),仍廣泛應(yīng)用于普通數(shù)據(jù)的加密保護(hù)領(lǐng)域。對(duì)普通的請(qǐng)求、返回?cái)?shù)據(jù),生成MD5校驗(yàn)(MD5中加入動(dòng)態(tài)密鑰),進(jìn)行數(shù)據(jù)完整性校驗(yàn)。
SHA256:SHA256是SHA-2下細(xì)分出的一種算法。SHA-2,名稱來(lái)自于安全散列算法2(Secure Hash Algorithm 2)的縮寫,一種密碼散列函數(shù)算法標(biāo)準(zhǔn),由美國(guó)國(guó)家安全局研發(fā),屬于SHA算法之一,是SHA-1的后繼者。SHA-2下又可再分為六個(gè)不同的算法標(biāo)準(zhǔn),包括:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。這些標(biāo)準(zhǔn)除了生成摘要的長(zhǎng)度 、循環(huán)運(yùn)行的次數(shù)等一些微小差異外,算法的基本結(jié)構(gòu)是一致的?;氐絊HA256上,說(shuō)白了,它就是一個(gè)哈希函數(shù)。對(duì)于任意長(zhǎng)度的消息,SHA256都會(huì)產(chǎn)生一個(gè)256bit長(zhǎng)的哈希值,稱作消息摘要。SHA256算法也叫信息摘要算法。這個(gè)摘要相當(dāng)于是個(gè)長(zhǎng)度為32個(gè)字節(jié)的數(shù)組,通常用一個(gè)長(zhǎng)度為64的十六進(jìn)制字符串來(lái)表示。主要適用于數(shù)字簽名標(biāo)準(zhǔn)(DigitalSignature Standard DSS)里面定義的數(shù)字簽名算法(Digital Signature Algorithm DSA)。
常用算法:SHA-256、SHA-512
CryptoKit:蘋果提供的系統(tǒng)加密庫(kù),是一個(gè)新的Swift框架,支持iOS13.0及以上操作系統(tǒng),能簡(jiǎn)化哈希、密鑰生成和加密之類的操作。用法詳見Demo:https://github.com/zhoushejun/SJSecurity
CryptoKit 支持的算法有:
加密哈希函數(shù):SHA256、SHA384、SHA512。
消息認(rèn)證碼算法:HMAC、SymmetricKey。
對(duì)稱加密:AES、ChaChaPoly。
非對(duì)稱加密:Curve25519、P256\P384\P521。
CryptoKit 廢棄的算法有:MD5、SHA1。
其中,筆者未用過(guò)的算法有:
SymmetricKey:生成對(duì)稱密鑰,可指定任意長(zhǎng)度。
ChaChaPoly:使用ChaCha20-Poly1305加密和密封數(shù)據(jù)。
P256\P384\P521:NIST的P-X系列橢圓曲線,支持硬件加解密。
筆者實(shí)現(xiàn)的CryptoKit支持的部分算法的用法詳見連接里的Demo:https://github.com/zhoushejun/SJSecurity
四、編碼方式
Base58編碼:是用于Bitcoin中使用的一種獨(dú)特的編碼方式,主要用于產(chǎn)生Bitcoin的錢包地址。相比Base64,Base58不使用數(shù)字"0",字母大寫"O",字母大寫"I",和字母小寫"l",以及"+"和"/"符號(hào)。設(shè)計(jì)Base58主要的目的是:避免混淆。在某些字體下,數(shù)字0和字母大寫O,以及字母大寫I和字母小寫l會(huì)非常相似。不使用"+"和"/"的原因是非字母或數(shù)字的字符串作為帳號(hào)較難被接受。沒有標(biāo)點(diǎn)符號(hào),通常不會(huì)被從中間分行。大部分的軟件支持雙擊選擇整個(gè)字符串。但是這個(gè)base58的計(jì)算量比base64的計(jì)算量多了很多。因?yàn)?8不是2的整數(shù)倍,需要不斷用除法去計(jì)算。而且長(zhǎng)度也比base64稍微多了一點(diǎn)。
Base58Check編碼:是一種用在比特幣中的Base58 編碼格式,比特幣有內(nèi)置的檢查錯(cuò)誤的編碼?!靶r?yàn)和”是從編碼的數(shù)據(jù)的哈希值中得到的,可以用來(lái)檢測(cè)并避免轉(zhuǎn)錄和輸入中產(chǎn)生的錯(cuò)誤。使用Base58Check編碼時(shí),解碼軟件會(huì)計(jì)算數(shù)據(jù)的“校驗(yàn)和”并和編碼中自帶的“校驗(yàn)和”進(jìn)行對(duì)比。二者不匹配則表明有錯(cuò)誤產(chǎn)生,那么這個(gè)Base58Check的數(shù)據(jù)就是無(wú)效的。在比特幣中,大多數(shù)需要向用戶展示的數(shù)據(jù)都使用Base58Check編碼,可以實(shí)現(xiàn)數(shù)據(jù)壓縮,易讀而且有錯(cuò)誤檢驗(yàn)。Base58Check編碼中的版本前綴是用來(lái)創(chuàng)造易于辨別的格式,在Base58Check編碼的有效載荷的開始包含了明確的屬性。這些屬性使用戶可以輕松明確被編碼的數(shù)據(jù)的類型以及如何使用它們。
Base64編碼:Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的方法。10個(gè)數(shù)字+26大寫字母+26小寫字母+“+”+“/”。Base64不是一種加密算法,雖然編碼后的字符串看起來(lái)有點(diǎn)加密的趕腳,但它實(shí)際上是一種“二進(jìn)制到文本”的編碼方法,它能夠?qū)⒔o定的任意二進(jìn)制數(shù)據(jù)轉(zhuǎn)換(映射)為ASCII字符串的形式,以便在只支持文本的環(huán)境中也能夠順利地傳輸二進(jìn)制數(shù)據(jù)。采用Base64編碼具有不可讀性,需要解碼后才能閱讀。
參考資料:
MurmurHash:https://sites.google.com/site/murmurhash/
SMHasher:https://github.com/aappleby/smhasher
橢圓加密算法-百度百科:https://baike.baidu.com/item/橢圓加密算法/10305582
curve25519-donna算法實(shí)現(xiàn):https://github.com/agl/curve25519-donna
CryptoKit加密庫(kù):http://www.awhisper.net/2019/06/06/wwdc2019-cryptography/
CryptoKit 蘋果原生加密庫(kù)官網(wǎng):https://developer.apple.com/documentation/cryptokit