本篇主要介紹筆者在iOS開發(fā)工作中用到的加解密算法的使用沸枯,主要包括:
1)對稱加密算法:AES日矫、DES、3DES
2)非對稱加密算法:RSA绑榴、DSA哪轿、ECC
3)哈希(散列)函數(消息摘要算法):MD5、SHA1翔怎、SHA256窃诉、MurmurHash
4)編碼方式:Base64、Base58
5)蘋果原生加密相關算法的系統(tǒng)庫:CommonCrypto、Security褐奴、CryptoKit
在講解每一種加解密算法的使用時按脚,筆者都會盡可能的附上相應的代碼,希望能讓讀者更容易理解或直接用于項目中敦冬。如有疑問歡迎留言探討辅搬。
本篇對應的Deom地址:https://github.com/zhoushejun/SJSecurity,歡迎Star脖旱。
APP內的數據安全是非常重要的一部分堪遂,尤其是對用戶的隱私數據的保護。在我們的日常開發(fā)工作中萌庆,需要對應用中的多項數據進行加解密處理溶褪,但從性能與安全性方面考慮,可能會使用一種或多種不同的加解密算法践险。
一猿妈、對稱加密算法
基本概念:指加密和解密使用相同密鑰的加密算法,也叫私鑰加密巍虫。
嚴格來講不一定是相同的密鑰彭则,滿足以下條件也是對稱加密:加密密鑰能夠從解密密鑰中推算出來,同時解密密鑰也可以從加密密鑰中推算出來占遥。但在大多數的對稱加密算法中俯抖,加密密鑰和解密密鑰是相同的。
優(yōu)點:算法公開瓦胎,計算量小芬萍,加解密速度快、效率高搔啊。
缺點:對稱加密算法的安全性取決于加密密鑰的保存情況柬祠,安全性得不到保證。
常用算法:AES坯癣、DES瓶盛、3DES
AES:高級加密標準(Advanced Encryption Standard)最欠,是現(xiàn)在公認的最安全的加密方式示罗,是對稱密鑰加密中最流行的算法。蘋果的鑰匙串訪問采用的就AES加密芝硬。AES有兩種常用的加密模式:
ECB模式:電子密碼本(Electronic Code Book Mode)蚜点,加密文件會被分為若干個加密塊,每個塊都是獨立進行加密拌阴,無初始向量绍绘,相同的明文將永遠加密成相同的密文。容易受到密碼本重放攻擊,一般情況下很少用陪拘。
CBC模式:密碼塊鏈(Cipher Block Chaining Mode)厂镇,使用一個密鑰和一個初始化向量(IV)對數據執(zhí)行加密轉換。加密文件同樣會被分為若干個加密塊左刽,每個塊都依賴于上一個加密塊進行加密捺信,明文被加密前要與前面的密文進行異或運算后再加密,因此只要選擇不同的初始向量欠痴,相同的明文加密后會形成不同的密文迄靠,這是目前應用最廣泛的模式。CBC加密后的密文是上下文相關的喇辽,但明文的錯誤不會傳遞到后續(xù)分組掌挚,但如果一個分組丟失,后面的分組將全部作廢(同步錯誤)菩咨。
DES:數據加密標準吠式,加密強度不夠,能夠暴力破解抽米。筆者開發(fā)中未曾使用奇徒。
3DES:使用3個密鑰對相同的數據執(zhí)行3次加密,增強加密強度缨硝。但需要維護3個密鑰摩钙,維護成本大。筆者開發(fā)中也未曾使用查辩。
CommonCrypto庫:蘋果提供的系統(tǒng)加密庫胖笛,有原生的對稱加密算法和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加解密算法:
二郎任、非對稱加密算法
基本概念:指加密和解密使用不同密鑰的加密算法,也稱為公私鑰加密备籽。
優(yōu)點:公鑰是公開的涝滴,私鑰是自己保存的,不需要將私鑰給別人胶台,安全性更高歼疮。
缺點:加解密花費時間長、速度慢诈唬,只適合對少量數據進行加密韩脏。加解密速度要遠遠慢于對稱加密。
常用算法:RSA铸磅、DSA赡矢、ECC
Security.framework:蘋果提供的系統(tǒng)加密庫,支持iOS和Mac開發(fā)阅仔。需要了解這庫里的兩個結構體:
SecPadding:創(chuàng)建或驗證數字簽名時使用的填充類型吹散。。
SecKeyAlgorithm:對SecKey對象執(zhí)行加密操作的可用算法八酒。其支持的算法有:RSA空民、ECDSA、ECIES羞迷、ECDH等算法界轩。
RSA:該算法由3位麻省理工學院的數學家“羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)”一起設計的衔瓮,可以實現(xiàn)非對稱加密浊猾。所以用他們三個人的名字命名,叫RSA算法热鞍。歐拉定理是RSA算法的核心葫慎,理解了這個定理,就可以理解RSA薇宠。主要了解公私鑰的生成偷办、公鑰加密、私鑰解密昼接、私鑰簽名爽篷、公鑰驗簽、讀取證書信息慢睡,以及在Keychain中存儲逐工、查找、刪除密鑰等功能漂辐。
ECDSA:橢圓曲線數字簽名算法(ECDSA)是使用橢圓曲線密碼(ECC)對數字簽名算法(DSA)的模擬泪喊,是一種數字簽名算法。
ECDH:ECC算法和DH結合使用髓涯,用于密鑰磋商袒啼,這個密鑰交換算法稱為ECDH。交換雙方可以在不共享任何秘密的情況下協(xié)商出一個密鑰纬纪。ECC是建立在基于橢圓曲線的離散對數問題上的密碼體制蚓再,給定橢圓曲線上的一個點P,一個整數k包各,求解Q=kP很容易摘仅;給定一個點P、Q问畅,知道Q=kP娃属,求整數k確是一個難題。ECDH是安全密鑰交換算法护姆。
ECIES:是一種集成加密方案矾端。ECIES加密可以認為是先基于ECDH協(xié)商密鑰,再用剛剛協(xié)商一致的密鑰進行對稱加密卵皂,這樣能夠結合非對稱加密和對稱加密的優(yōu)點秩铆。
1)RSA生成密鑰對算法:
2)RSA加解密算法:
擴展:根據官方資料顯示,上圖中的加解密算法加密的文本長度是受限制的灯变。RSA加解密為塊加密算法( block cipher algorithm)豺旬,在固定長度的數據塊上進行操作。 block length是跟key length 以及所使用的填充模式相關:
Raw模式:要加密的數據塊長度 <= SecKeyGetBlockSize(:)
PKCS1模式:要加密的數據塊長度 <= SecKeyGetBlockSize(:)-11柒凉。(Public Key Cryptography Standards)
OAEPX模式:要加密的數據塊長度 <= SecKeyGetBlockSize(:)-42/58/66/98/130族阅。(Optimal Asymmetric Encryption Padding)
RSA加密的兩種算法分別是RSAES-PKCS-v1_5 and RSAES-OAEP。這里有必要了解一下加密算法參數algorithm的各種值的意義膝捞,在實際情況下才能根據需要使用:
rsaEncryptionRaw:原始的RSA加密或解密坦刀,數據的大小必須符合RSA密鑰的模數大小。直接不使用填充的算法在密碼學上是非常弱的蔬咬。輸入數據大小必須小于或等于key length大小鲤遥,并且返回的塊大小總是與SecKeyGetBlockSize()返回的塊大小相同。
rsaEncryptionPKCS1:RSA加密或解密林艘,數據填充使用PKCS#1填充方案盖奈。此算法僅用于與現(xiàn)有協(xié)議和數據的向后兼容,筆者不建議再使用這個填充方案的加密算法狐援。建議選擇更強的加密算法(參見rsaEncryptionOAEP)钢坦。輸入數據最多只能是“SecKeyGetBlockSize() - 11”bytes字節(jié)長究孕,并且返回的塊大小總是與SecKeyGetBlockSize()返回的塊大小相同。
rsaEncryptionOAEP(SHAX)系列:SHAX系列包括-SHA1(-42)爹凹、SHA224(-58)厨诸、SHA256(-66)、SHA384(-98)禾酱、SHA512(-130)微酬。RSA加密或解密,使用OAEP填充方案填充的數據颤陶,其內部使用SHAX哈希算法颗管。輸入數據最多只能是“SecKeyGetBlockSize()- 42/58/66/98/130”bytes字節(jié)長,并且返回的塊大小總是與SecKeyGetBlockSize()返回的塊大小相同滓走。使用對應的算法:rsaEncryptionOAEPSHAXAESGCM能夠加密和解密任意長的數據垦江。
rsaEncryptionOAEP(SHAXAESGCM)系列:使用OAEP填充方案,由RSA加密隨機生成的AES會話密鑰闲坎。在GCM模式下疫粥,使用全部為0的16字節(jié)長IV(初始化向量)的會話密鑰對用戶數據進行加密。最后腰懂,將16字節(jié)的AES-GCM標記附加到密文后梗逮。如果RSA密鑰為4096bit或更大,則使用256bit長的AES密鑰绣溜,否則使用128bit長的AES密鑰慷彤。原始public key公鑰數據用作AES-GCM加密的身份驗證數據。
這里需要了解一個問題:什么是AES-GCM怖喻?待完善底哗。。锚沸。
3)RSA簽名與驗簽算法:
擴展:目前主流的RSA簽名方式包括RSA-PSS和RSA-PKCS跋选,簽名過程包括hash和加密。
PSS: (Probabilistic Signature Scheme)私鑰簽名流程的一種填充模式哗蜈。相對應PKCS是一種能夠自我從簽名中恢復原來的簽名前标,而PSS無法從簽名中恢復原來的簽名。openssl-1.1.x以后默認在ssl握手的server key exchange階段使用更安全的PSS的RSA簽名模式距潘。
PKCS1:(Public Key Cryptography Standards)
PKCS1SHAX:選擇對應的SHA1/224/256/384/512哈希算法把要簽名的數據轉換后成標準的“ASN.1”格式的數據后炼列,再用private key按PKCS數據填充模式對這個數據進行加密。
問題1:為什么RSA簽名要引入模式音比?
因為RSA算法沒有加入亂數俭尖,TLS流程中的密鑰材料若不進行填充而直接加密,那么顯然相同的key,會得到相同的密文稽犁。這種在語義上來說焰望,當出現(xiàn)重復性的原始資料,攻擊者會通過相同加密密文而猜測出原文缭付,這是不安全的柿估。因此導入padding的機制來加強安全性陷猫。
4)讀取本地證書公私鑰算法
擴展:證書相關的一些概念或操作
SSL/TLS:Secure Sockets Layer (安全套接層協(xié)議)/Transport Layer Security (傳輸層安全)嚎卫。TLS協(xié)議包括兩層:TLS記錄和TLS握手協(xié)議卫键,SSL/TLS 握手是為了安全地協(xié)商出一份對稱加密的密鑰斗搞“T可以通過Wireshark 抓包工具查看在TLS的握手過程中的各種參數克伊。
SSL/TLS協(xié)議的基本過程:
1)客戶端向服務器端索要并驗證公鑰降瞳。
2)雙方協(xié)商生成會話密鑰嚼鹉,也叫“共享密鑰”袁滥、“公共密鑰”星虹。
3)雙方采用會話密鑰進行加密通信零抬。
OpenSSL:Open Secure Sockets Layer(開放式安全套接層協(xié)議),是一個開放源代碼的軟件庫包宽涌。主要功能包括:SSL協(xié)議庫平夜、應用程序以及密碼算法庫等3個部分,囊括了主要的密碼算法卸亮、常用的密鑰和證書封裝管理功能以及SSL協(xié)議忽妒,并提供了豐富的應用程序供測試或其它目的使用。
OpenSSL實現(xiàn)的算法:
8種對稱加密算法:AES兼贸、DES段直、CAST、RC2溶诞、RC4鸯檬、RC5、Blowfish螺垢、IDEA喧务。
4種非對稱加密算法:DH、RSA甩苛、DSA蹂楣、ECC。
6種信息摘要算法:MD2讯蒲、MD5痊土、MDC2、SHA(SHA1)墨林、RIPEMD赁酝、DSS(DSS1)犯祠。
X.509:密碼學里公鑰證書的格式標準,即證書標準酌呆,主要定義了證書中應該包含哪些內容衡载。
證書的編碼格式:
PEM:ASCII格式。Privacy Enhanced Mail(隱私增強型電子郵件)隙袁,DER編碼的證書再進行Base64編碼后的數據痰娱,打開看文本格式,以“-----BEGIN CERTIFICATE-----”開頭菩收,“-----END CERTIFICATE-----”結尾梨睁。
DER:二進制格式。Distinguished Encoding Rules娜饵,打開看是二進制格式坡贺,不可讀,但Base64編碼后也很常見箱舞。
證書的擴展名:
.pem:見編碼格式遍坟。
.crt:證書可以被編碼為二進制DER或ASCII PEM。 cer和crt擴展幾乎是同義詞晴股。
.cer: .crt的替代形式愿伴。
.der:見編碼格式。
.p7b队魏,.p7c:PKCS#7格式公般,簽名的數據結構沒有數據,只有證書或URL胡桨。
.pfx:PKCS#12之前的格式(通常用PKCS#12格式官帘,比如那些由IIS產生的PFX文件)。
.p12:PKCS#12格式昧谊,二進制格式刽虹,包含證書的同時可能還有帶密碼保護的私鑰。
前向保密性:Forward Secrecy呢诬,將來任何加密密鑰的披露都無法解密過去的任何記錄涌哲。
5)Keychain密鑰操作
待完善。尚镰。阀圾。
擴展:把公鑰和私鑰信息保存到Keychain里面。
6)ECDSA
擴展:ECDSA(Elliptic Curve Digital Signature Algorithm) 是橢圓曲線數字簽名算法狗唉,是 DSA 作用于橢圓曲線的一個變種算法初烘,是使用橢圓曲線密碼(ECC)對數字簽名算法(DSA)的模擬。ECDSA 需要使用明文的哈希結果,而不是明文本身肾筐。哈希函數的選擇取決于使用者哆料,但是需要明確的是必須選擇加密安全的哈希函數。對于相同的安全級別吗铐,ECDSA密鑰和簽名比RSA中的短东亦,256-bit的ECDSA簽名具有與3072-bit的RSA簽名相同的安全強度。
7)DH唬渗、ECDH典阵、X3DH
擴展:
DH:Diffie-Hellman密鑰交換協(xié)議/算法(Diffie-Hellman Key Exchange/Agreement Algorithm),DH密鑰交換是一種安全協(xié)議谣妻。它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道創(chuàng)建起一個密鑰萄喳。這個密鑰可以在后續(xù)的通訊中作為對稱密鑰來加密通訊內容卒稳。公鑰交換的概念最早由瑞夫·墨克提出蹋半,而這個密鑰交換方法,由惠特菲爾德·迪菲和馬丁·赫爾曼在1976年首次發(fā)表充坑。 DH密鑰交換的同義詞包括: DH密鑰協(xié)商减江、DH密鑰創(chuàng)建、指數密鑰交換捻爷、DH協(xié)議辈灼。雖然DH密鑰交換本身是一個匿名的密鑰交換協(xié)議,它卻是很多認證協(xié)議的基礎也榄,并且被用來提供傳輸層安全協(xié)議的短暫模式中的前向安全性巡莹。DH密鑰交換協(xié)議/算法只能用于密鑰的交換,而不能進行消息的加密和解密甜紫。雙方確定要用的密鑰后降宅,要使用其他對稱密鑰操作加密算法實現(xiàn)加密和解密消息。DH與RSA的不同之處在于囚霸,DH不是加密算法腰根,它只是生成可用作對稱密鑰的秘密數值。在DH密鑰交換過程中拓型,發(fā)送方和接收方分別生成一個秘密的隨機數额嘿,并根據隨機數推導出公開值,然后劣挫,雙方再交換公開值册养。DH算法的基礎是具備生成共享密鑰的能力。只要交換了公開值压固,雙方就能使用自己的私有數和對方的公開值來生成對稱密鑰球拦,稱為共享密鑰,對雙方來說,該對稱密鑰是相同的刘莹,可以用于使用對稱加密算法加密數據阎毅。
ECDH:本質是密鑰協(xié)商協(xié)議,是橢圓曲線的Diffie-Hellman算法的一種變體点弯,而不僅僅是加密算法扇调。從根本上講,這意味著ECDH在一定程度上定義了各方之間如何生成和交換密鑰抢肛。如何使用這些密鑰加密數據取決于通信雙方狼钮。常用來做ECDH密鑰交換的橢圓曲線Curve25519和Curve448,也用來做數字簽名捡絮。
為什么Curve25519和Curve448的公私鑰對可以用來做數字簽名熬芜?
Ed25519,Ed448和Curve25519和Curve448的差異福稳,這兩者分別是曲線的不同表達形式涎拉,一個是 Twisted Edwards曲線(適合做簽名曲線) ,一個是Montgomery曲線(適合做DH曲線)的圆,兩者之間可以相互轉化(一個曲線上的點可以對應到另外一個曲線上的點)鼓拧,這也是為什么Curve25519和Curve448的公私鑰對可以用來做數字簽名。
X3DH:是ECDH的擴展越妈,用來在通信雙方之間建立共享密鑰季俩。相比ECDH,它最大的不同就是引入了第三方服務器的角色梅掠,使得X3DH可以實現(xiàn)某一方在離線的時候也可以進行密鑰交換來建立共享密鑰酌住,同時根據用戶唯一的身份密鑰提供身份認證,以及前向安全性阎抒。為了實現(xiàn)上述的功能酪我,需要用戶提前在服務器存儲自己的身份密鑰IK,帶簽名的預存密鑰SPK挠蛉,以及一組一次性密鑰OPK祭示。把以上密鑰上傳到第三方服務器后,其他用戶就可以根據這些密鑰異步地和該用戶協(xié)商共同密鑰谴古,而不需用戶保持在線质涛。協(xié)商密鑰的消息上傳到服務器,等用戶上線的時候再去獲取計算共同密鑰掰担。
8)ECC
擴展:ECC(Elliptic Curve Cryptography)橢圓加密算法是一種基于橢圓曲線數學的公開密鑰加密算法汇陆,是一種公鑰加密體制,其數學基礎是利用橢圓曲線上的有理點構成Abel加法群上橢圓離散對數的計算困難性带饱。公鑰密碼體制根據其所依據的難題一般分為三類:大素數分解問題類毡代、離散對數問題類阅羹、橢圓曲線類。有時也把橢圓曲線類歸為離散對數類教寂。
9)HKDF
擴展:HMAC-based KDF(Key Derivation Function)捏鱼,基于HMAC的密鑰推導函數(也叫密鑰派生函數)。HKDF算法是TLS1.3中關于密鑰生成的重要的基礎算法酪耕,跟密鑰推導密切相關导梆。HKDF根據初始獲取的一些密鑰材料,從中派生出一個或多個安全強度很大的密鑰迂烁。用法詳見第三方庫 **HKDFKit **地址:https://github.com/WhisperSystems/HKDFKit.git
10)Curve25519
擴展:Curve25519是目前最高水平的Diffie-Hellman函數看尼。給定用戶的32字節(jié)密鑰和另一個用戶的32字節(jié)公共密鑰,Curve25519計算兩個用戶共享的32字節(jié)密鑰即共享密鑰盟步。然后藏斩,在這兩個用戶之間可以用這個共享密鑰進行身份驗證和加密消息。用法詳見第三方庫 **Curve25519Kit **地址:https://github.com/WhisperSystems/Curve25519Kit
三却盘、哈希(散列)函數(消息摘要算法)
基本概念:哈希函數狰域,又稱散列函數、散列算法谷炸,是一種從任何數據中創(chuàng)建小的數字“指紋”的方法北专。散列函數把消息或數據壓縮成摘要,使得數據量變小旬陡,將數據的格式固定下來。該函數將數據打亂混合语婴,重新創(chuàng)建一個叫做散列值(或哈希值)的指紋描孟。散列值通常用一個短的隨機字母和數字組成的字符串來代表。
哈希函數分:非加密哈希函數砰左、加密哈希函數匿醒。
第一代非加密哈希函數代表:lookup3,大約為0.5 bytes/cycle缠导,于2006年由Bob Jenkins(人名)發(fā)布廉羔。
第二代非加密哈希函數代表:MurmurHash,大約是lookup3速度的2倍(大約為1 byte/cycle)僻造,當前的版本是MurmurHash3憋他, 能夠產生出32-bit或128-bit哈希值。
第三代非加密哈希函數代表:CityHash 和 SpookyHash髓削。于2011年Google發(fā)布了CityHash竹挡,Bob Jenkins發(fā)布了SpookyHash。它們都擁有2倍于MurmurHash的速度立膛,但它們都只使用了64位數學函數而沒有32位版本揪罕,并且CityHash的速度取決于CRC32 指令梯码。SpookyHash給出128位輸出,而CityHash有64位好啰,128位以及256位等幾個變種轩娶。
以上三代非加密散列函數用的最多的地方是Hash Table。
MD5(Message - Digest Algorithm 5):MD5是一種被廣泛使用的密碼散列函數框往,由MD4罢坝、MD3、MD2改進而來搅窿,主要增強算法復雜度和不可逆性嘁酿,可以產生出一個128bit(16bytes)的散列值(hash value),用于確保信息傳輸完整一致男应。因其普遍闹司、穩(wěn)定、快速的特點沐飘,仍廣泛應用于普通數據的加密保護領域游桩。對普通的請求、返回數據耐朴,生成MD5校驗(MD5中加入動態(tài)密鑰)借卧,進行數據完整性校驗。
SHA256:SHA256是SHA-2下細分出的一種算法筛峭。SHA-2铐刘,名稱來自于安全散列算法2(Secure Hash Algorithm 2)的縮寫,一種密碼散列函數算法標準影晓,由美國國家安全局研發(fā)镰吵,屬于SHA算法之一,是SHA-1的后繼者挂签。SHA-2下又可再分為六個不同的算法標準疤祭,包括:SHA-224、SHA-256饵婆、SHA-384勺馆、SHA-512、SHA-512/224侨核、SHA-512/256草穆。這些標準除了生成摘要的長度 、循環(huán)運行的次數等一些微小差異外芹关,算法的基本結構是一致的续挟。回到SHA256上侥衬,說白了诗祸,它就是一個哈希函數跑芳。對于任意長度的消息,SHA256都會產生一個256bit長的哈希值直颅,稱作消息摘要博个。SHA256算法也叫信息摘要算法。這個摘要相當于是個長度為32個字節(jié)的數組功偿,通常用一個長度為64的十六進制字符串來表示盆佣。主要適用于數字簽名標準(DigitalSignature Standard DSS)里面定義的數字簽名算法(Digital Signature Algorithm DSA)。
常用算法:SHA-256械荷、SHA-512
CryptoKit:蘋果提供的系統(tǒng)加密庫共耍,是一個新的Swift框架,支持iOS13.0及以上操作系統(tǒng)吨瞎,能簡化哈希痹兜、密鑰生成和加密之類的操作。用法詳見Demo:https://github.com/zhoushejun/SJSecurity
CryptoKit 支持的算法有:
加密哈希函數:SHA256颤诀、SHA384字旭、SHA512。
消息認證碼算法:HMAC崖叫、SymmetricKey遗淳。
對稱加密:AES、ChaChaPoly心傀。
非對稱加密:Curve25519屈暗、P256\P384\P521。
CryptoKit 廢棄的算法有:MD5剧包、SHA1恐锦。
其中,筆者未用過的算法有:
SymmetricKey:生成對稱密鑰疆液,可指定任意長度。
ChaChaPoly:使用ChaCha20-Poly1305加密和密封數據陕贮。
P256\P384\P521:NIST的P-X系列橢圓曲線堕油,支持硬件加解密。
筆者實現(xiàn)的CryptoKit支持的部分算法的用法詳見連接里的Demo:https://github.com/zhoushejun/SJSecurity
四肮之、編碼方式
Base58編碼:是用于Bitcoin中使用的一種獨特的編碼方式掉缺,主要用于產生Bitcoin的錢包地址。相比Base64戈擒,Base58不使用數字"0"眶明,字母大寫"O",字母大寫"I"筐高,和字母小寫"l"搜囱,以及"+"和"/"符號丑瞧。設計Base58主要的目的是:避免混淆。在某些字體下蜀肘,數字0和字母大寫O绊汹,以及字母大寫I和字母小寫l會非常相似。不使用"+"和"/"的原因是非字母或數字的字符串作為帳號較難被接受扮宠。沒有標點符號西乖,通常不會被從中間分行。大部分的軟件支持雙擊選擇整個字符串坛增。但是這個base58的計算量比base64的計算量多了很多获雕。因為58不是2的整數倍,需要不斷用除法去計算收捣。而且長度也比base64稍微多了一點届案。
Base58Check編碼:是一種用在比特幣中的Base58 編碼格式,比特幣有內置的檢查錯誤的編碼坏晦÷茜瑁“校驗和”是從編碼的數據的哈希值中得到的,可以用來檢測并避免轉錄和輸入中產生的錯誤昆婿。使用Base58Check編碼時球碉,解碼軟件會計算數據的“校驗和”并和編碼中自帶的“校驗和”進行對比。二者不匹配則表明有錯誤產生仓蛆,那么這個Base58Check的數據就是無效的睁冬。在比特幣中,大多數需要向用戶展示的數據都使用Base58Check編碼看疙,可以實現(xiàn)數據壓縮豆拨,易讀而且有錯誤檢驗。Base58Check編碼中的版本前綴是用來創(chuàng)造易于辨別的格式能庆,在Base58Check編碼的有效載荷的開始包含了明確的屬性施禾。這些屬性使用戶可以輕松明確被編碼的數據的類型以及如何使用它們。
Base64編碼:Base64是網絡上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一搁胆,Base64就是一種基于64個可打印字符來表示二進制數據的方法弥搞。10個數字+26大寫字母+26小寫字母+“+”+“/”。Base64不是一種加密算法渠旁,雖然編碼后的字符串看起來有點加密的趕腳攀例,但它實際上是一種“二進制到文本”的編碼方法,它能夠將給定的任意二進制數據轉換(映射)為ASCII字符串的形式顾腊,以便在只支持文本的環(huán)境中也能夠順利地傳輸二進制數據粤铭。采用Base64編碼具有不可讀性,需要解碼后才能閱讀杂靶。
參考資料:
MurmurHash:https://sites.google.com/site/murmurhash/
SMHasher:https://github.com/aappleby/smhasher
橢圓加密算法-百度百科:https://baike.baidu.com/item/橢圓加密算法/10305582
curve25519-donna算法實現(xiàn):https://github.com/agl/curve25519-donna
CryptoKit加密庫:http://www.awhisper.net/2019/06/06/wwdc2019-cryptography/
CryptoKit 蘋果原生加密庫官網:https://developer.apple.com/documentation/cryptokit