版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2020.08.01 星期六 |
前言
CryptoKit
是iOS13
的新的SDK她君,接下來(lái)幾篇我們就一起看一下這個(gè)專(zhuān)題阵子。感興趣的可以看下面幾篇文章。
1. CryptoKit框架詳細(xì)解析(一) —— 基本概覽(一)
開(kāi)始
首先看下主要內(nèi)容:
密碼學(xué)
(Cryptography)
是保護(hù)用戶(hù)數(shù)據(jù)的關(guān)鍵狠半。 本教程向您展示如何使用Apple
的新CryptoKit API
來(lái)驗(yàn)證或加密應(yīng)用程序的數(shù)據(jù)穴墅,內(nèi)容來(lái)自翻譯。
接著就是下面的寫(xiě)作環(huán)境:
Swift 5, iOS 13, Xcode 11
下面就是正文了
如果您的應(yīng)用程序需要的內(nèi)容超過(guò)Apple
的默認(rèn)硬件和軟件保護(hù)斋枢,則Apple的新CryptoKit API使您能夠?qū)?yīng)用程序發(fā)送和接收的數(shù)據(jù)進(jìn)行身份驗(yàn)證和加密帘靡。
在本文中,您將使用對(duì)稱(chēng)密鑰(symmetric key)
和公用密鑰加密技術(shù)(public key cryptography)
對(duì)數(shù)據(jù)進(jìn)行身份驗(yàn)證和加密杏慰。 您將了解何時(shí)以及如何使用:
Cryptographic hashing
Hash-based Message Authentication Code (HMAC)
Authenticated Encryption with Associated Data (AEAD) ciphers
Public key cryptography with elliptic curves (ECC)
Digital signatures
Key agreement
繼續(xù)閱讀以解鎖所有秘密测柠!
本教程假定您熟悉J.K撰寫(xiě)的《哈利波特》系列炼鞠。 羅琳還是沒(méi)有興趣閱讀它缘滥。 它討論了最近幾本書(shū)中揭示的秘密。
在啟動(dòng)starter
文件夾中打開(kāi)谒主,構(gòu)建和運(yùn)行SecretKeeper
項(xiàng)目朝扼。
這個(gè)應(yīng)用程式列出了伏地魔的魂器 Voldemort’s horcruxes。只要他的靈魂的一部分在這些物品之一中是安全的霎肯,伏地魔(Voldemort)
就不會(huì)被殺死擎颖。因此,他必須對(duì)所有人观游,尤其是阿不思·鄧布利多和哈利·波特搂捧,保持自己身份和位置的秘密。
Protecting Users’ Data
就像Voldemort
的秘密一樣懂缕,您的用戶(hù)數(shù)據(jù)也需要保護(hù)允跑,以防止意外或惡意破壞以及未經(jīng)授權(quán)的使用。 iOS在Foundation / NSData搪柑,Security / Keychain
和CloudKit
中已經(jīng)具有很多內(nèi)置或易于使用的安全性聋丝。如果您的應(yīng)用訪(fǎng)問(wèn)HTTPS
服務(wù)器,則可以免費(fèi)獲得TLS
加密和數(shù)字簽名工碾。如果您的應(yīng)用需要驗(yàn)證數(shù)據(jù)或驗(yàn)證發(fā)件人弱睦,那么現(xiàn)在有了CryptoKit
。
您需要在以下三種狀態(tài)的每一種中保護(hù)數(shù)據(jù):
- Data in motion - 動(dòng)態(tài)數(shù)據(jù):傳輸中渊额,通常通過(guò)網(wǎng)絡(luò)
- Data in use - 正在使用的數(shù)據(jù):在內(nèi)存中
- Data at rest - 靜態(tài)數(shù)據(jù):存儲(chǔ)在磁盤(pán)上况木,未使用
傳輸數(shù)據(jù)(Data in motion)
是進(jìn)行加密的最初原因,可以追溯到凱撒密碼 Caesar cipher向凱撒將軍發(fā)送書(shū)面命令之前旬迹。如今焦读,如果您的應(yīng)用程序使用TLS 1.3
與服務(wù)器通信,則加密由傳輸層安全性Transport Layer Security(TLS)
處理舱权。但是您可能仍然需要使用加密哈希和鍵簽名對(duì)數(shù)據(jù)和發(fā)送方進(jìn)行身份驗(yàn)證矗晃。本教程的大部分內(nèi)容與這些主題有關(guān)。
使用中的數(shù)據(jù)(Data in use)
必須受到用戶(hù)身份驗(yàn)證的保護(hù)宴倍。要限制何時(shí)可以執(zhí)行操作张症,請(qǐng)使用本地身份驗(yàn)證(Local Authentication )
來(lái)檢查用戶(hù)何時(shí)以及如何進(jìn)行身份驗(yàn)證仓技。例如,您可能要求用戶(hù)使用生物識(shí)別技術(shù)(Face ID or Touch ID)
進(jìn)行身份驗(yàn)證俗他,以確保用戶(hù)在場(chǎng)脖捻。
靜態(tài)數(shù)據(jù)(Data at rest )
通過(guò)Data Protection API
在設(shè)備上受到保護(hù)。設(shè)置設(shè)備密碼后兆衅,用戶(hù)即可獲得自動(dòng)軟件數(shù)據(jù)保護(hù)地沮。每個(gè)新文件都會(huì)獲得一個(gè)新的256位加密密鑰,該密鑰特定于文件的保護(hù)類(lèi)型羡亩。共有三種文件保護(hù)類(lèi)型:
- Protected Until First User Authentication - 在首次用戶(hù)身份驗(yàn)證之前受保護(hù):默認(rèn)文件保護(hù)類(lèi)型摩疑。設(shè)備啟動(dòng)時(shí)無(wú)法訪(fǎng)問(wèn)該文件,但是直到設(shè)備重新啟動(dòng)后畏铆,即使設(shè)備已鎖定雷袋,也可以訪(fǎng)問(wèn)該文件。
- Complete - 已完成:僅當(dāng)設(shè)備解鎖后才能訪(fǎng)問(wèn)該文件辞居。
- Complete Unless Open - 除非打開(kāi)楷怒,否則完成:如果設(shè)備鎖定時(shí)文件已打開(kāi),則仍然可以訪(fǎng)問(wèn)瓦灶。如果設(shè)備鎖定時(shí)文件未打開(kāi)鸠删,則只有在設(shè)備解鎖后才能訪(fǎng)問(wèn)該文件。
當(dāng)設(shè)備鎖定以允許網(wǎng)絡(luò)傳輸繼續(xù)時(shí)贼陶,您可能需要允許訪(fǎng)問(wèn)文件刃泡。
您的應(yīng)用程序還可以將加密數(shù)據(jù)存儲(chǔ)在私有CloudKit
數(shù)據(jù)庫(kù)中,該數(shù)據(jù)庫(kù)可在所有用戶(hù)設(shè)備上使用每界。
1. Increasing Protection for Voldemort’s Secrets
SecretKeeper
從文件讀取以創(chuàng)建魂器(horcruxes)
列表捅僵。 該應(yīng)用程序?qū)懭氪宋募r(shí)沒(méi)有文件保護(hù)選項(xiàng):
try data.write(to: secretsURL)
這意味著秘密文件僅具有默認(rèn)的文件保護(hù),因此在應(yīng)用程序處于后臺(tái)甚至鎖定狀態(tài)下都可以訪(fǎng)問(wèn)該文件眨层。
Voldemort
的機(jī)密需要更高級(jí)別的文件保護(hù)庙楚。 在ContentView.swift
的writeFile(items :)
中,用以下這一行替換data.write(to :)
語(yǔ)句:
try data.write(to: secretsURL, options: .completeFileProtection)
使用此級(jí)別的保護(hù)趴樱,僅當(dāng)設(shè)備解鎖后才能訪(fǎng)問(wèn)該文件馒闷。
2. Keychain and Secure Enclave
您的應(yīng)用程序應(yīng)在本地或iCloud
鑰匙串中存儲(chǔ)加密密鑰,身份驗(yàn)證令牌和密碼(encryption keys, authentication tokens and passwords)
叁征。蘋(píng)果公司的示例應(yīng)用程序在鑰匙串中存儲(chǔ)CryptoKit密鑰Storing CryptoKit Keys in the Keychain顯示了如何將CryptoKit
密鑰類(lèi)型P256
纳账,P384
和P521
轉(zhuǎn)換為SecKey
,并將其他密鑰類(lèi)型轉(zhuǎn)換為通用密碼捺疼。
自2013
年底以來(lái)發(fā)布的iOS設(shè)備(iPhone 5S疏虫,iPad Air
和更高型號(hào))均采用Secure Enclave芯片。 Secure Enclave
是一個(gè)專(zhuān)用的加密引擎,與處理器分開(kāi)卧秘,并在工廠融合了設(shè)備的Unique IDentifier (UID)
256
位加密密鑰呢袱。 Secure Enclave
還存儲(chǔ)TouchID
和FaceID
的生物特征數(shù)據(jù)。
Secure Enclave
中的密鑰和數(shù)據(jù)永不離開(kāi)翅敌。它們永遠(yuǎn)不會(huì)加載到內(nèi)存或?qū)懭氪疟P(pán)羞福,因此受到了完全保護(hù)。您的應(yīng)用程序通過(guò)郵箱與Secure Enclave
通信蚯涮,您可以在其中存儲(chǔ)要加密或解密的數(shù)據(jù)治专,然后檢索結(jié)果。
CryptoKit
使您的應(yīng)用程序可以直接在Secure Enclave
中創(chuàng)建用于公共密鑰加密的密鑰遭顶。本教程結(jié)尾處有示例代碼张峰。
Using CryptoKit
所有這些內(nèi)置的數(shù)據(jù)保護(hù)可能會(huì)滿(mǎn)足您的應(yīng)用需求∫杭。或者挟炬,如果您的應(yīng)用程序使用第三方加密的數(shù)據(jù)或驗(yàn)證文件傳輸或財(cái)務(wù)交易鸥滨,則可能需要使用CryptoKit
嗦哆。
1. Rolling Your Own Crypto: Don’t
數(shù)據(jù)安全是密碼學(xué)家和攻擊者之間的戰(zhàn)場(chǎng)。除非您是密碼學(xué)家婿滓,否則編寫(xiě)自己的密碼算法會(huì)對(duì)用戶(hù)數(shù)據(jù)造成巨大風(fēng)險(xiǎn)老速。有許多針對(duì)不同平臺(tái)的加密框架。現(xiàn)在凸主,您有了Apple的CryptoKit
橘券,可以非常輕松地在應(yīng)用程序中使用加密。
2. Performance: Don’t Worry
性能如何卿吐? CryptoKit
建立在Apple本地加密庫(kù)corecrypto
的基礎(chǔ)上旁舰。 Corecrypto
的手動(dòng)調(diào)整匯編代碼可以高效利用硬件。
3. Cryptographic Hashing
現(xiàn)在介紹密碼學(xué)(cryptography)
的最基本形式嗡官。您可能熟悉對(duì)字典項(xiàng)或數(shù)據(jù)庫(kù)記錄進(jìn)行哈希處理以提高檢索效率的想法箭窜。許多標(biāo)準(zhǔn)類(lèi)型都符合Hashable協(xié)議conform to the Hashable protocol。將這些類(lèi)型的對(duì)象哈希到哈希器Hasher
中會(huì)產(chǎn)生具有合理唯一性的整數(shù)哈希值衍腥。輸入的較小更改會(huì)導(dǎo)致哈希值發(fā)生較大更改磺樱。
Hasher
使用隨機(jī)生成的種子值,因此每次您的應(yīng)用運(yùn)行時(shí)婆咸,它都會(huì)產(chǎn)生不同的哈希值竹捉。親自看看這個(gè)。
在起始文件夾中打開(kāi)CryptoKitTutorial.playground
尚骄。第一部分块差,Hashable Protocol
,具有以下hashItem(item :)
函數(shù):
func hashItem(item: String) -> Int {
var hasher = Hasher()
item.hash(into: &hasher)
return hasher.finalize()
}
通過(guò)在下面添加以下行來(lái)進(jìn)行嘗試:
let hashValue = hashItem(item: "the quick brown fox")
運(yùn)行playground
。 哈希值顯示在結(jié)果側(cè)欄中憨闰,或單擊Show Result
按鈕以在playground
上查看它:
您的值與我的不同询兴。再次運(yùn)行playground
,您將獲得不同的值起趾。
與Hasher
不同诗舰,加密哈希(cryptographic hashing)
每次都會(huì)產(chǎn)生相同的哈希值。像Hasher
算法一樣训裆,密碼哈希算法(cryptographic hashing algorithm)
會(huì)產(chǎn)生幾乎唯一的哈希值眶根,而對(duì)輸入的較小更改會(huì)導(dǎo)致哈希值發(fā)生較大變化。差異是边琉,即產(chǎn)生可以可靠地驗(yàn)證數(shù)據(jù)完整性的哈希值(稱(chēng)為摘要或校驗(yàn)和)所需的計(jì)算量不同属百。
密碼哈希算法(Cryptographic hashing algorithms)
為輸入數(shù)據(jù)創(chuàng)建一個(gè)小的,固定長(zhǎng)度的变姨,幾乎唯一的數(shù)據(jù)值(摘要)族扰。最常見(jiàn)的摘要大小是256
位和512
位。 512
位摘要可以截?cái)酁?code>384位定欧。找到兩個(gè)產(chǎn)生相同摘要的輸入是不太可能但并非不可能渔呵,因?yàn)?code>256位或512
位摘要分別只有2^256
或2^512
個(gè)可能的值。
散列算法(Hashing algorithms)
是單向的砍鸠,并且包含非線(xiàn)性運(yùn)算扩氢,因此攻擊者無(wú)法反轉(zhuǎn)運(yùn)算來(lái)從摘要中計(jì)算原始數(shù)據(jù)。輸出的每一位都取決于輸入的每一位爷辱,因此攻擊者無(wú)法嘗試根據(jù)摘要的一部分來(lái)計(jì)算部分輸入录豺。即使更改輸入中的單個(gè)位也會(huì)產(chǎn)生完全不同的摘要,因此攻擊者無(wú)法找到輸入和輸出之間的關(guān)系饭弓。
這些特征使您可以通過(guò)計(jì)算摘要來(lái)查看兩個(gè)數(shù)據(jù)集是否不同双饥。 例如,Git
計(jì)算摘要以標(biāo)識(shí)每個(gè)提交弟断。 您可以傳輸或存儲(chǔ)數(shù)據(jù)及其摘要咏花,以檢測(cè)隨后的更改,例如數(shù)據(jù)損壞夫嗓。 軟件下載通常提供摘要迟螺,稱(chēng)為校驗(yàn)和(checksum)
。 下載器使用相同的哈希算法(hashing algorithm)
為下載的數(shù)據(jù)計(jì)算摘要舍咖。 如果此摘要與文件的校驗(yàn)和不匹配矩父,則表明文件已損壞或不完整。
CryptoKit
提供了Secure Hash Algorithm 2 (SHA-2)算法SHA-256
排霉,SHA-384
和SHA-512
窍株。 數(shù)字表示摘要大小。 其不安全(Insecure)
的容器提供SHA-1(160
位)和MD5(128
位),以便與較早的服務(wù)向后兼容球订。 SHA-2由美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究院(U.S. National Institute of Standards and Technology)(NIST)
發(fā)布后裸,法律要求在某些美國(guó)政府應(yīng)用中使用。
在playground
上冒滩,向下滾動(dòng)至以下語(yǔ)句:
UIImage(data: data)
在結(jié)果側(cè)邊欄中微驶,單擊w 714 h 900
旁邊的Show Result
,以查看數(shù)據(jù)是一歲的Harry Potter
的圖像:
當(dāng)伏地魔沒(méi)能殺死哈利時(shí)开睡,他不小心把他變成了魂器因苹。 但是伏地魔不知道這一點(diǎn)。 Albus Dumbledore
知道篇恒,他想與哈利分享這個(gè)秘密扶檐。
首先,您作為Dumbledore
創(chuàng)建此數(shù)據(jù)的摘要胁艰。 添加此行:
let digest = SHA256.hash(data: data)
這就是您要做的款筑! SHA256
產(chǎn)生256
位摘要。 使用其他兩種哈希算法之一 SHA384
或SHA512
一樣容易腾么。 而且奈梳,如果Apple將它們更新為使用SHA-3而不是SHA-2
,則您無(wú)需更改代碼哮翘。
然后Dumbledore
通過(guò)網(wǎng)絡(luò)連接將數(shù)據(jù)和摘要發(fā)送給Harry
颈嚼。 因此毛秘,現(xiàn)在饭寺,作為Harry
,添加以下代碼來(lái)檢查摘要匹配情況:
let receivedDataDigest = SHA256.hash(data: data)
if digest == receivedDataDigest {
print("Data received == data sent.")
}
您對(duì)數(shù)據(jù)使用相同的哈希算法叫挟,然后檢查兩個(gè)摘要值是否相等艰匙。
運(yùn)行playground
。 消息打印抹恳。 不足為奇员凝,因?yàn)?code>data沒(méi)有機(jī)會(huì)被破壞。
現(xiàn)在奋献,單擊receivedDataDigest
旁邊的Show Result
按鈕以很好地了解摘要:
這是一個(gè)元組健霹。 不太可讀。
鍵入以下行以顯示其description
:
String(describing: digest)
注意:
Apple
的文檔不建議直接調(diào)用.description
瓶蚂。
運(yùn)行playground
糖埋。 點(diǎn)擊顯示結(jié)果:
摘要description
包含一個(gè)字符串String
。 這更易于理解窃这,看起來(lái)像一個(gè)Git
哈希值瞳别,但長(zhǎng)度是它的兩倍。 它也比Hasher
哈希值長(zhǎng)得多。
最后祟敛,要查看數(shù)據(jù)的微小變化如何產(chǎn)生完全不同的摘要疤坝,請(qǐng)對(duì)兩條相同的代碼行之一進(jìn)行很小的更改。 例如:
String(describing: SHA256.hash(data: "Harry is a horcrux".data(using: .utf8)!))
String(describing: SHA256.hash(data: "Harry's a horcrux".data(using: .utf8)!))
運(yùn)行playground
馆铁。 單擊兩行的顯示結(jié)果:
請(qǐng)注意跑揉,您得到的哈希值與我完全一樣。
4. Signing the Digest
散列數(shù)據(jù)(Hashing data)
并不能保護(hù)您免受惡意更改的侵害埠巨,因?yàn)閻阂夤粽咧粫?huì)為他們更改后的數(shù)據(jù)發(fā)送正確的摘要畔裕。
基于哈希的消息身份驗(yàn)證代碼(Hash-based Message Authentication Code - HMAC)
通過(guò)使用對(duì)稱(chēng)加密密鑰(symmetric cryptographic key)
對(duì)摘要進(jìn)行簽名來(lái)防止惡意更改。 一個(gè)常見(jiàn)的用例是對(duì)文件的摘要簽名乖订,以便應(yīng)用程序的服務(wù)器可以檢查您是否有權(quán)上傳文件扮饶。
“Symmetric key”
是指發(fā)送者和接收者都知道秘密密鑰。 HMAC
使用秘密密鑰派生內(nèi)部和外部密鑰乍构。 然后甜无,它根據(jù)數(shù)據(jù)和內(nèi)部鍵創(chuàng)建內(nèi)部哈希。 最后哥遮,它根據(jù)內(nèi)部哈希和外部密鑰創(chuàng)建簽名岂丘。
這就是算法的作用。 但是眠饮,要使用CryptoKit
創(chuàng)建對(duì)稱(chēng)密鑰(symmetric key)
奥帘,只需鍵入以下行:
let key256 = SymmetricKey(size: .bits256)
與Apple
的舊C
加密API相比,它的工作量要少得多仪召,后者必須轉(zhuǎn)換位和字節(jié)寨蹋,并記得在完成操作后從內(nèi)存中刪除密鑰!
對(duì)HMAC
的最常見(jiàn)攻擊是蠻力發(fā)現(xiàn)密鑰扔茅,因此HMAC
的安全性取決于密鑰的大小已旧。 CryptoKit
允許三種密鑰大小:.bits128
召娜,.bits192
和.bits256
运褪。
接下來(lái),添加以下兩個(gè)代碼語(yǔ)句:
let sha512MAC = HMAC<SHA512>.authenticationCode(
for: data, using: key256)
String(describing: sha512MAC)
您正在使用對(duì)稱(chēng)密鑰(symmetric key)
為數(shù)據(jù)data
創(chuàng)建摘要玖瘸,因此現(xiàn)在將摘要稱(chēng)為身份驗(yàn)證代碼或簽名(authentication code or signature)
秸讹。
運(yùn)行playground
。 點(diǎn)擊顯示結(jié)果以查看簽名的描述:
您已經(jīng)為嬰兒圖片生成了512
位(64字節(jié))簽名雅倒。
要通過(guò)網(wǎng)絡(luò)發(fā)送此簽名璃诀,請(qǐng)將其轉(zhuǎn)換為Data
:
let authenticationCodeData = Data(sha512MAC)
現(xiàn)在,Dumbledore
將簽名的數(shù)據(jù)發(fā)送給您屯断,即哈里文虏。 您作為哈利已經(jīng)擁有相同的密鑰key256
侣诺。 輸入以下代碼以驗(yàn)證您收到的信息:
if HMAC<SHA512>.isValidAuthenticationCode(authenticationCodeData,
authenticating: data, using: key256) {
print("The message authentication code is validating the data: \(data))")
UIImage(data: data)
}
else { print("not valid") }
如果簽名有效,您即哈利查看數(shù)據(jù)氧秘,就知道這確實(shí)是Dumbledore
發(fā)送的年鸳。
運(yùn)行playground
。 單擊print
語(yǔ)句旁邊和UIImage
旁邊的顯示結(jié)果:
HMAC
可讓您驗(yàn)證發(fā)件人的身份和數(shù)據(jù)的完整性丸相,但不對(duì)數(shù)據(jù)進(jìn)行加密搔确。如果您忘記使用TLS
驶鹉,而Voldemort
截取了傳輸信息迄汛,他會(huì)懷疑Harry
是他的靈魂之一。
或者趾浅,Voldemort
可能決定手動(dòng)加密他的魂器清單弛作,以確保Dumbledore
和Harry
找不到并銷(xiāo)毀它們涕蜂。
數(shù)據(jù)加密就是密碼學(xué)的全部?jī)?nèi)容,因此來(lái)了映琳。
5. Encrypting and Authenticating Data
即使使用TLS
加密網(wǎng)絡(luò)數(shù)據(jù)机隙,您也可能希望將加密的文件發(fā)送給用戶(hù)。例如萨西,如果他們進(jìn)行了應(yīng)用內(nèi)購(gòu)買(mǎi)有鹿,則可以向他們發(fā)送加密文件和(單獨(dú))解密文件的密鑰。
當(dāng)前的技術(shù)水平是具有關(guān)聯(lián)數(shù)據(jù)的認(rèn)證加密(Authenticated Encryption with Associated Data - AEAD)
密碼谎脯。 AEAD
密碼使用不同的密鑰進(jìn)行加密和MAC
葱跋,并且MAC
會(huì)對(duì)密碼文本而不是純文本進(jìn)行哈希處理。一切都結(jié)合到一個(gè)密封的盒子里源梭。
有兩種常用的AEAD
:Advanced Encryption Standard Galois/Counter Mode (AES-GCM)
和 ChaCha20-Poly1305
娱俺。兩者都是Apple
加密API的新功能。 AES-GCM
是NIST
建立的標(biāo)準(zhǔn)咸产。 Daniel J. Bernstein
開(kāi)發(fā)了ChaCha20-Poly1305
矢否,以防攻擊者設(shè)法破壞AES-GCM
。
在2019年脑溢,幾乎所有TLS
流量都使用AES
,但是ChaCha20-Poly1305
越來(lái)越受歡迎赖欣,因?yàn)樵诓恢С?code>AES-GCM的移動(dòng)設(shè)備上屑彻,它比AES-GCM
快得多。但是請(qǐng)放心在您的應(yīng)用程序中使用AES-GCM
顶吮,因?yàn)?code>iOS設(shè)備具有AES
硬件社牲。
AES
和ChaCha20
是密碼算法。 GCM
和Poly1305
是MAC
算法悴了。伯恩斯坦(Bernstein)
從他較早的莎莎(Salsa)
密碼開(kāi)發(fā)了ChaCha20
搏恤。
要?jiǎng)?chuàng)建密封盒违寿,AEAD
密碼采用以下輸入:
- 1) 要加密的明文
- 2) 秘密鑰匙
- 3) 唯一的初始化值 -
IV
或隨機(jī)數(shù):這可以防止重播攻擊,例如某人(確實(shí)需要生命)重新發(fā)送同一購(gòu)物車(chē)訂單多次熟空。 - 4) 可選:已認(rèn)證但未加密的其他非秘密數(shù)據(jù)藤巢。這是
AEAD
中的AD
。
然后進(jìn)行密封操作:
- 1) 使用密鑰和隨機(jī)數(shù)生成輔助密鑰息罗。
- 2) 使用密鑰和隨機(jī)數(shù)將數(shù)據(jù)加密為長(zhǎng)度相等的加密數(shù)據(jù)(密文
ciphertext
)掂咒。 - 3) 使用輔助密鑰來(lái)生成任何其他數(shù)據(jù),加密數(shù)據(jù)及其長(zhǎng)度的帶密鑰摘要迈喉。
- 4) 使用密鑰和隨機(jī)數(shù)加密密鑰摘要绍刮,然后將加密的密鑰摘要附加到加密的數(shù)據(jù)。
在此圖中挨摸,我省略了相關(guān)數(shù)據(jù):
這看起來(lái)需要很多工作孩革,不是嗎? 好吧得运,這里是您要鍵入的所有內(nèi)容嫉戚,以創(chuàng)建一個(gè)密封的盒子:
let sealedBoxData = try! ChaChaPoly.seal(data, using: key256).combined
您提供數(shù)據(jù)和密鑰以得到一個(gè)密封的盒子。 它的combined
屬性是Data
類(lèi)型澈圈,您可以通過(guò)網(wǎng)絡(luò)發(fā)送它彬檀。
要改用AES-GCM
,您可以將ChaChaPoly
替換為AES.GCM
瞬女。
現(xiàn)在窍帝,Dumbledore
將密封的盒子數(shù)據(jù)發(fā)送給哈利。 您是哈利诽偷,請(qǐng)鍵入以下代碼以將其轉(zhuǎn)回密封盒中:
let sealedBox = try! ChaChaPoly.SealedBox(combined: sealedBoxData)
作為哈利的用戶(hù)已經(jīng)具有與鄧布利多相同的密鑰坤学,因此您可以打開(kāi)密封盒并解密其密文(ciphertext)
:
let decryptedData = try! ChaChaPoly.open(sealedBox, using: key256)
運(yùn)行playground
注意SealedBoxData
的大小比圖像數(shù)據(jù)大28
個(gè)字節(jié)。 添加這些行以查看密封框盒還有什么:
sealedBox.nonce // 12 bytes
sealedBox.tag // 16 bytes
兩種算法都會(huì)為您選擇一個(gè)隨機(jī)數(shù)报慕,然后將其打包到密封的盒子中以供使用深浮。 太簡(jiǎn)單! 16
字節(jié)tag
是加密的密鑰摘要 - 驗(yàn)證數(shù)據(jù)的簽名眠冈。 每次創(chuàng)建密封盒時(shí)飞苇,隨機(jī)數(shù)都會(huì)更改,這也會(huì)更改加密的密鑰摘要蜗顽。 因此布卡,您的實(shí)際nonce
和tag
值與我的屏幕截圖不匹配。
最后雇盖,為了證明無(wú)法查看加密數(shù)據(jù)忿等,請(qǐng)?zhí)砑右韵滦校?/p>
let encryptedData = sealedBox.ciphertext
UIImage(data: encryptedData)
UIImage(data: decryptedData)
運(yùn)行playground
,查看以下行:
這樣就很容易發(fā)送加密的數(shù)據(jù)崔挖,但是發(fā)送者和接收者都需要知道密鑰贸街。如果不可能的話(huà)怎么辦庵寞?
Public-Key Cryptography
注意:這仍然是
CryptoKit
的一部分,但這是一個(gè)很大的話(huà)題薛匪,因此請(qǐng)獲取其自己的部分捐川。
HMAC
和密封箱(Sealed Box)
加密使用對(duì)稱(chēng)密鑰,其中發(fā)送者和接收者都知道密鑰蛋辈。對(duì)稱(chēng)密鑰必須“帶外”傳輸属拾。如果您不能安全地執(zhí)行此操作,請(qǐng)使用公共密鑰加密冷溶。實(shí)際上渐白,互聯(lián)網(wǎng)上的大多數(shù)常規(guī)加密都使用公鑰加密,包括每當(dāng)Xcode
對(duì)您的應(yīng)用進(jìn)行簽名時(shí)逞频。
公鑰加密(Public-key cryptography)
創(chuàng)建兩個(gè)數(shù)學(xué)鏈接的密鑰纯衍。您將私鑰保密,并發(fā)布相應(yīng)的公鑰數(shù)據(jù)苗胀。您使用私鑰對(duì)數(shù)據(jù)或其摘要簽名襟诸,然后將其發(fā)送。接收者根據(jù)您的公共密鑰數(shù)據(jù)創(chuàng)建一個(gè)公共密鑰基协,然后使用它來(lái)檢查已簽名的數(shù)據(jù)或摘要歌亲。
例如,您的應(yīng)用可能需要通過(guò)后端服務(wù)器對(duì)操作進(jìn)行身份驗(yàn)證澜驮。它在用戶(hù)的設(shè)備上創(chuàng)建一個(gè)私鑰陷揪,并將其存儲(chǔ)在Keychain
或SecureEnclave
中,然后在服務(wù)器上注冊(cè)相應(yīng)的公鑰杂穷。用戶(hù)設(shè)置操作時(shí)悍缠,您的應(yīng)用會(huì)使用用戶(hù)的私鑰對(duì)操作的詳細(xì)信息進(jìn)行簽名,然后將簽名的詳細(xì)信息發(fā)送到服務(wù)器耐量,服務(wù)器將使用用戶(hù)的公鑰對(duì)其進(jìn)行驗(yàn)證飞蚓。
要發(fā)送加密的數(shù)據(jù),您和您的收件人分別創(chuàng)建一對(duì)密鑰并發(fā)布公共密鑰廊蜒。然后趴拧,你們兩個(gè)都將您的私鑰與另一個(gè)人的公鑰結(jié)合在一起,以創(chuàng)建共享密鑰劲藐。你們兩個(gè)都使用該共享機(jī)密來(lái)導(dǎo)出相同的對(duì)稱(chēng)密鑰八堡,然后可以按照上一節(jié)中的說(shuō)明將其用于AEAD
。
1. Creating Private and Public Keys
公鑰密碼術(shù)的關(guān)鍵特征是它使用活板門(mén)算法(trapdoor algorithms
):從公鑰中計(jì)算私鑰非常困難聘芜。
在1978
年發(fā)布后,RSA(Rivest-Shamir-Adleman)
成為最受歡迎的公鑰算法缝龄。它依賴(lài)于確定一個(gè)非常非常大的數(shù)字的兩個(gè)素?cái)?shù)因子的難度汰现。其他數(shù)學(xué)家則面臨挑戰(zhàn)挂谍,開(kāi)發(fā)了只能通過(guò)增加鍵的大小來(lái)阻止因素分解的算法。生成RSA
密鑰的速度很慢瞎饲,并且時(shí)間隨著密鑰的大小而增加口叙。最終,保理算法的改進(jìn)速度快于移動(dòng)設(shè)備進(jìn)行大量計(jì)算的能力嗅战。注意力轉(zhuǎn)移到另一種技術(shù)上妄田,事實(shí)證明,這種技術(shù)很難被攻擊驮捍。
ECC (Elliptic Curve Cryptography)
, 于1985年首次提出疟呐,自2004年以來(lái)已廣泛使用,并在2015年底成為服務(wù)器上的首選技術(shù)东且。ECC
密鑰比具有類(lèi)似安全性的RSA
密鑰小得多:例如启具, 256
位ECC
公鑰與3072
位RSA
公鑰相當(dāng)。
CryptoKit
僅使用ECC
算法珊泳。您可以在此處選擇NIST
的P256 / P384 / P521
或Daniel J. Bernstein
的Curve25519
鲁冯。 P256
是迄今為止使用最廣泛的曲線(xiàn)。這是OpenSSL
的默認(rèn)曲線(xiàn)色查,稱(chēng)為prime256v1
薯演。 P384
的計(jì)算量是P256
的2-3
倍。美國(guó)國(guó)家安全局(NSA)
要求使用P384
保護(hù)絕密信息秧了。 P256
和P384
位于NSA
的Suite B Cryptography
中跨扮,但P521
沒(méi)有,而且我找不到有關(guān)誰(shuí)使用它的任何信息示惊。超級(jí)驚嚇吧好港?
注意:在2018年,
NSA
用 Commercial National Security Algorithm Suite(CNSA)
取代了Suite B
米罚,這是其向抗量子密碼技術(shù)(quantum-resistant cryptography)
過(guò)渡的一步钧汹,因?yàn)榱孔佑?jì)算quantum computing可以輕松打破ECC
算法。
伯恩斯坦(Bernstein)
在NSA Suite B
的同一年發(fā)布了Curve25519
录择,但在愛(ài)德華·斯諾登(Edward Snowden)
于2013年發(fā)布內(nèi)部備忘錄后暗示拔莱,NSA
已在基于橢圓曲線(xiàn)的偽隨機(jī)生成器Dual_EC_DRBG
中插入了密碼后門(mén),從而使其流行度提高隘竭。 Dual_EC_DRBG
和P256
都依賴(lài)于 Nothing Up My Sleeve (NUMS)
幻數(shù)塘秦。密碼學(xué)界懷疑,NSA使用特殊值來(lái)導(dǎo)出這些幻數(shù)动看,從而使它們能夠解密使用P256
加密的任何內(nèi)容尊剔。 Curve25519
不依賴(lài)于幻數(shù)。它的計(jì)算復(fù)雜度比P256
低40%
菱皆。并且2018年TLS 1.3
標(biāo)準(zhǔn)需要對(duì)此提供支持须误。
2. ECC: How Does It Work?
像這樣this one的許多文章都使用小質(zhì)數(shù)算法以易于理解的方式解釋RSA
挨稿。該算法非常聰明。
橢圓曲線(xiàn)密碼學(xué)(Elliptic curve cryptography)
甚至更好京痢!但是解釋起來(lái)有點(diǎn)復(fù)雜奶甘。
橢圓曲線(xiàn)由滿(mǎn)足以下形式的等式的(x,y)
點(diǎn)組成:
y^2 = x^3 + ax + b
例如祭椰,y^2 = x^3 - x + 1
看起來(lái)如下所示:
您可以在Desmos Graphing Calculator.中繪制更多的橢圓曲線(xiàn)臭家。
ECC
使用橢圓曲線(xiàn)的兩個(gè)屬性:
- 1) 任何非垂直線(xiàn)與圖形的相交點(diǎn)不得超過(guò)三個(gè)點(diǎn)。
- 2) 該圖圍繞
x
軸對(duì)稱(chēng)方淤。
這些屬性使您可以定義圖形上任意兩個(gè)點(diǎn)之間的點(diǎn)運(yùn)算:
- 1) 在點(diǎn)A和點(diǎn)B之間畫(huà)一條線(xiàn)钉赁。
- 2) 如果該線(xiàn)在第三個(gè)點(diǎn)交到圖形,則在
x
軸上反射以得到點(diǎn)C = A·B
臣淤。
您還可以定義點(diǎn)乘法運(yùn)算k * A
橄霉,其中k
是一個(gè)正整數(shù)。
- 1) 從
A·A
開(kāi)始獲得點(diǎn)B
:在點(diǎn)A
處的曲線(xiàn)上繪制切線(xiàn)邑蒋,并在x軸擊中圖形的地方橫切x
線(xiàn)姓蜂。這是第一個(gè)點(diǎn)操作。 - 2) 現(xiàn)在執(zhí)行
A·B
以獲得點(diǎn)C
医吊,然后A·C = D
钱慢,依此類(lèi)推∏涮茫總共進(jìn)行k
個(gè)點(diǎn)運(yùn)算束莫,以點(diǎn)P
結(jié)尾。如果您告訴某人點(diǎn)A
和P
在哪里草描,那么他們很難計(jì)算k
览绿。
實(shí)際算法僅使用x
和y
的整數(shù)值,以質(zhì)數(shù)n
為模穗慕。起點(diǎn)稱(chēng)為生成器饿敲,因此通常稱(chēng)為G
。它的屬性為n * G =G
逛绵。
要設(shè)置ECC
密碼系統(tǒng)怀各,請(qǐng)選擇一個(gè)曲線(xiàn)方程式(x
的系數(shù)和常數(shù)b
),該曲線(xiàn)上的生成器點(diǎn)G
及其對(duì)應(yīng)的素?cái)?shù)n
术浪。私鑰是隨機(jī)選擇的數(shù)字k
瓢对,公鑰是k * G
- 對(duì)G
進(jìn)行k
點(diǎn)操作后曲線(xiàn)上的端點(diǎn)。
當(dāng)然胰苏,您不需要執(zhí)行任何操作硕蛹。已經(jīng)有標(biāo)準(zhǔn)曲線(xiàn),如Curve25519
和NIST ECC
所使用的曲線(xiàn),并通過(guò)CryptoKit
的公鑰方法實(shí)現(xiàn)妓美。
3. Digital Signatures
數(shù)字簽名就像HMAC
僵腺,但帶有公共密鑰密碼學(xué)鲤孵。發(fā)送者不是使用相同的密鑰來(lái)簽名和驗(yàn)證壶栋,而是使用私鑰進(jìn)行簽名,接收者使用發(fā)送者的公鑰進(jìn)行驗(yàn)證普监。
數(shù)字簽名的縮寫(xiě)是使用NIST
的P256 / P384 / P512
曲線(xiàn)的橢圓曲線(xiàn)數(shù)字簽名算法(Elliptic Curve Digital Signature Algorithm - ECDSA)
贵试,以及使用Bernstein
的Ed25519
曲線(xiàn)的Edwards
曲線(xiàn)數(shù)字簽名算法(EdDSA)
。
假設(shè)您像Dumbledore
一樣想要將魂器圖像發(fā)送給哈利凯正。 您將對(duì)其進(jìn)行簽名毙玻,以便Harry
可以從您作為Dumbledore
處進(jìn)行驗(yàn)證。 首先廊散,創(chuàng)建用于數(shù)字簽名的私鑰和公鑰:
let albusSigningPrivateKey = Curve25519.Signing.PrivateKey()
let albusSigningPublicKeyData =
albusSigningPrivateKey.publicKey.rawRepresentation
公鑰的rawRepresentation
類(lèi)型為Data
桑滩,因此您可以通過(guò)網(wǎng)絡(luò)發(fā)送它。
接下來(lái)允睹,您作為Dumbledore
使用私鑰對(duì)數(shù)據(jù)進(jìn)行簽名:
let signatureForData = try! albusSigningPrivateKey.signature(for: data)
或者运准,您可以簽署數(shù)據(jù)摘要,這樣更快:
let digest512 = SHA512.hash(data: data)
let signatureForDigest = try! albusSigningPrivateKey.signature(
for: Data(digest512))
您是鄧布利多缭受,這次使用SHA-512
胁澳。
當(dāng)使用Curve25519
私鑰時(shí),signature(for :)
使用SHA-512
作為哈希函數(shù)米者,生成數(shù)據(jù)的橢圓曲線(xiàn)數(shù)字簽名算法(EdDSA)
簽名或Ed25519
橢圓曲線(xiàn)上的摘要韭畸。 該算法會(huì)生成隨機(jī)隨機(jī)數(shù),以在每次調(diào)用時(shí)產(chǎn)生不同的簽名蔓搞,即使對(duì)于相同的數(shù)據(jù)和密鑰也是如此胰丁,以防止定時(shí)攻擊。
如果使用P256
而不是Curve25519
喂分,它將使用SHA-256
作為哈希函數(shù)锦庸,生成P-256
橢圓曲線(xiàn)上數(shù)據(jù)的橢圓曲線(xiàn)數(shù)字簽名算法(ECDSA)
簽名。
現(xiàn)在妻顶,您作為鄧布利多將data
酸员,digest512
和signatureForData
或signatureForDigest
發(fā)送給Harry。
切換到你是Harry
讳嘱,您添加此代碼以使用從albusSigningPublicKeyData
創(chuàng)建的密鑰來(lái)驗(yàn)證簽名幔嗦。
let publicKey = try! Curve25519.Signing.PublicKey(
rawRepresentation: albusSigningPublicKeyData)
if publicKey.isValidSignature(signatureForData, for: data) {
print("Dumbledore sent this data.")
}
if publicKey.isValidSignature(signatureForDigest,
for: Data(digest512)) {
print("Data received == data sent.")
UIImage(data: data)
}
注意:
P256
及其NIST
兄弟姐妹有一種方法來(lái)簽名摘要,而無(wú)需將其轉(zhuǎn)換為Data
沥潭。
運(yùn)行playground
以查看經(jīng)過(guò)身份驗(yàn)證的數(shù)據(jù):
這就是進(jìn)行數(shù)字簽名的容易程度邀泉。 但是同樣,數(shù)據(jù)沒(méi)有加密。 因此汇恤,請(qǐng)繼續(xù)閱讀庞钢!
4. Creating a Symmetric Key for Encryption
在本教程的早期,Dumbledore
和Harry
有一個(gè)他們都知道的秘密密鑰因谎,這使他們可以使用AEAD
密封盒來(lái)加密和解密數(shù)據(jù)基括。 但是伏地魔以某種方式發(fā)現(xiàn)了這個(gè)秘密鑰匙,并且不可能安全地設(shè)置一個(gè)新的對(duì)稱(chēng)鑰匙-哈里在奔跑财岔,鄧布利多只是一種精神-所以現(xiàn)在他們需要尋找另一種方式风皿。
密鑰協(xié)商算法(Key agreement algorithm)
使他們能夠從其公共密鑰和私有密鑰創(chuàng)建共享機(jī)密,然后添加約定的鹽值(salt value)
以生成對(duì)稱(chēng)密鑰(symmetric key)
匠璧。
計(jì)算共享秘密非常簡(jiǎn)單桐款。 如果G
是橢圓曲線(xiàn)的生成點(diǎn),而a
是鄧布利多的秘密密鑰夷恍,那么a * G
是他的公鑰魔眨。 同樣,Harry
的秘密密鑰是h
酿雪,而他的公共密鑰是h *G
遏暴。事實(shí)證明這是事實(shí):
(a * G) * h = (h * G) * a
是的,Harry
將Dumbledore
的公鑰乘以他的私鑰执虹,這與Dumbledore
通過(guò)將Harry
的公鑰乘以他自己的私鑰所獲得的相同拓挥。 魔法!
在這里袋励,acronym
是Diffie Hellman(ECDH)
秘鑰協(xié)議侥啤,使用NIST
的P256 / P384 / P512
曲線(xiàn)或Bernstein
的X25519
曲線(xiàn)。
首先茬故,鄧布利多和哈里創(chuàng)建密鑰協(xié)議的私鑰和公鑰盖灸,并將其公鑰發(fā)布為Data
。
let albusPrivateKey = Curve25519.KeyAgreement.PrivateKey()
let albusPublicKeyData = albusPrivateKey.publicKey.rawRepresentation
let harryPrivateKey = Curve25519.KeyAgreement.PrivateKey()
let harryPublicKeyData = harryPrivateKey.publicKey.rawRepresentation
Dumbledore
和Harry
必須就創(chuàng)建對(duì)稱(chēng)密鑰的鹽值達(dá)成共識(shí):
let protocolSalt = "Voldemort's Horcruxes".data(using: .utf8)!
通過(guò)網(wǎng)絡(luò)發(fā)送此郵件是安全的磺芭。 除非攻擊者也知道其中一個(gè)私鑰赁炎,否則它不會(huì)有所幫助。
Dumbledore
從原始表示中創(chuàng)建Harry
的公鑰钾腺,然后將其與他的私鑰結(jié)合起來(lái)徙垫,首先計(jì)算sharedSecret
,然后計(jì)算對(duì)稱(chēng)密鑰symmetricKey
:
let harryPublicKey = try! Curve25519.KeyAgreement.PublicKey(
rawRepresentation: harryPublicKeyData)
let ADsharedSecret = try! albusPrivateKey.sharedSecretFromKeyAgreement(
with: harryPublicKey)
let ADsymmetricKey = ADsharedSecret.hkdfDerivedSymmetricKey(
using: SHA256.self, salt: protocolSalt,
sharedInfo: Data(), outputByteCount: 32)
哈里(Harry)
從原始表示中創(chuàng)建了鄧布利多(Dumbledore)
的公鑰放棒,然后將其與他的私鑰結(jié)合起來(lái)姻报,首先計(jì)算sharedSecret
,然后計(jì)算symmetricKey
:
let albusPublicKey = try! Curve25519.KeyAgreement.PublicKey(
rawRepresentation: albusPublicKeyData)
let HPsharedSecret = try! harryPrivateKey.sharedSecretFromKeyAgreement(
with: albusPublicKey)
let HPsymmetricKey = HPsharedSecret.hkdfDerivedSymmetricKey(
using: SHA256.self, salt: protocolSalt,
sharedInfo: Data(), outputByteCount: 32)
現(xiàn)在來(lái)看它們是否匹配:
if ADsymmetricKey == HPsymmetricKey {
print("Dumbledore and Harry have the same symmetric key.")
}
運(yùn)行playground
就像是魔術(shù)一樣间螟,鄧布利多和哈利產(chǎn)生了相同的對(duì)稱(chēng)密鑰吴旋! 現(xiàn)在损肛,他們可以使用此對(duì)稱(chēng)密鑰進(jìn)行AEAD
身份驗(yàn)證的加密。
5. P256 Key in Secure Enclave
注意:
SecureEnclave
代碼僅在具有Secure Enclave
芯片的設(shè)備上起作用:iPhone 5S荣瑟,iPad Air
和更高型號(hào)治拿。
為了提供額外的保護(hù),您可以直接在設(shè)備的Secure Enclave
中創(chuàng)建P256
私鑰笆焰。 對(duì)代碼的改動(dòng)很薪倭隆:
// Check that the device has a Secure Enclave
if SecureEnclave.isAvailable {
// Generate private key in Secure Enclave
let privateKey = try SecureEnclave.P256.Signing.PrivateKey()
} else {
let privateKey = P256.Signing.PrivateKey()
}
使用Secure Enclave
中的私鑰,創(chuàng)建公鑰數(shù)據(jù)和簽名數(shù)據(jù)或摘要的工作原理完全相同:
// Create public key data
let publicKeyData = privateKey.publicKey.compactRepresentation!
// Produce a signature
let dataSignature = try privateKey.signature(for: data)
let digestSignature = try privateKey.signature(for: digest)
注意:您只能在
Secure Enclave
中創(chuàng)建P256
密鑰仙辟。 這可能是因?yàn)樵撔酒?code>P256使用的AES
引擎同波,而不是因?yàn)槊绹?guó)政府要求蘋(píng)果提供后門(mén)。
Secure Enclave
具有以下很酷的功能:您可以通過(guò)訪(fǎng)問(wèn)控制來(lái)限制密鑰的使用叠国。 例如:
let accessControl = SecAccessControlCreateWithFlags(
nil,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
[.privateKeyUsage, .userPresence],
nil)!
let privateKey = try SecureEnclave.P256.Signing.PrivateKey(
accessControl: accessControl)
您正在設(shè)置訪(fǎng)問(wèn)控制,因此只有在設(shè)備解鎖后才能訪(fǎng)問(wèn)在Secure Enclave
中創(chuàng)建的密鑰戴尸,并且僅在此設(shè)備上可用粟焊。另外,您的應(yīng)用在執(zhí)行私鑰操作時(shí)要求用戶(hù)在場(chǎng)孙蒙。需要用戶(hù)在場(chǎng)意味著用戶(hù)必須通過(guò)TouchID
或FaceID
或設(shè)備密碼進(jìn)行身份驗(yàn)證项棠。
Complying With Encryption Export Regulations
最后一件事。在許多國(guó)家挎峦,加密是一個(gè)敏感的政治問(wèn)題香追。該地圖This map顯示了哪些國(guó)家/地區(qū)具有許可或注冊(cè)要求,進(jìn)出口控制坦胶,提供者協(xié)助當(dāng)局的義務(wù)和其他限制透典。
美國(guó)是實(shí)行出口管制的國(guó)家之一。這是合法的內(nèi)容顿苇,因此我將直接引用Apple的文章 Complying with Encryption Export Regulations:
當(dāng)您將應(yīng)用程序提交到
TestFlight
或App Store
時(shí)峭咒,會(huì)將您的應(yīng)用程序上傳到美國(guó)的服務(wù)器。如果您在美國(guó)或加拿大境外分發(fā)應(yīng)用程序纪岁,則無(wú)論您的法人實(shí)體位于何處凑队,您的應(yīng)用程序都必須遵守美國(guó)出口法律。如果您的應(yīng)用使用幔翰,訪(fǎng)問(wèn)漩氨,包含,實(shí)施或合并加密遗增,則這被視為加密軟件的出口叫惊,這意味著您的應(yīng)用要遵守美國(guó)出口合規(guī)性要求以及您分發(fā)產(chǎn)品所在國(guó)家/地區(qū)的進(jìn)口合規(guī)性要求。應(yīng)用程式贡定。
從Apple
的App Store Connect Help
Export compliance overview:
加密的使用包括但不限于:
- 通過(guò)安全通道(即
HTTPS赋访,SSL
等)進(jìn)行調(diào)用。 - 使用標(biāo)準(zhǔn)的加密算法。
- 使用其他來(lái)源的加密功能蚓耽,例如
iOS
或macOS
渠牲。 - 使用專(zhuān)有或非標(biāo)準(zhǔn)加密算法。美國(guó)政府將“非標(biāo)準(zhǔn)加密”
(non-standard cryptography)
定義為涉及并入或使用專(zhuān)有或未發(fā)布的加密功能的任何“加密”實(shí)施方式步悠,包括尚未得到公認(rèn)的國(guó)際標(biāo)準(zhǔn)機(jī)構(gòu)(例如签杈,未采用或批準(zhǔn))的加密算法或協(xié)議。IEEE鼎兽,IETF答姥,ISO,ITU谚咬,ETSI鹦付,3GPP,TIA
和GSMA
)择卦,除非另行發(fā)布敲长。
App Store Connect提供了一系列問(wèn)題App Store Connect provides a set of questions,可幫助您確定是否需要您提供出口合規(guī)性文件以及需要哪些表格秉继。
與往常一樣祈噪,您可以在源代碼中找到更多信息:
- WWDC 2019會(huì)議709:Cryptography and Your Apps。
- Apple CryptoKit documentation尚辑。
除了本教程中的(大部分為Wikipedia
)鏈接之外辑鲤,這是對(duì)橢圓曲線(xiàn)密碼學(xué)的解釋?zhuān)_實(shí)幫助我了解了所發(fā)生的情況:
A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography入門(mén)確實(shí)很容易理解,并且具有一些非常有用的GIF
動(dòng)畫(huà)杠茬。 但是月褥,請(qǐng)務(wù)必掃描注釋?zhuān)圆檎夷承┤鄙俚男畔ⅰ?Cloudflare
還有許多其他有關(guān)密碼學(xué)主題的精彩文章。
后記
本篇主要講述了
CryptoKit
使用入門(mén)簡(jiǎn)單示例澈蝙,感興趣的給個(gè)贊或者關(guān)注~~~