CryptoKit框架詳細(xì)解析(二) —— CryptoKit使用入門(mén)簡(jiǎn)單示例(一)

版本記錄

版本號(hào) 時(shí)間
V1.0 2020.08.01 星期六

前言

CryptoKitiOS13的新的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 / KeychainCloudKit中已經(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.swiftwriteFile(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纳账,P384P521轉(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ǔ)TouchIDFaceID的生物特征數(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上查看它:

Hasher hash value

您的值與我的不同询兴。再次運(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^2562^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)系饭弓。

Cryptographic digest is almost unique and very hard to reverse

這些特征使您可以通過(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)和不匹配矩父,則表明文件已損壞或不完整。

Receiver computes digest to check data is complete, not corrupted

CryptoKit提供了Secure Hash Algorithm 2 (SHA-2)算法SHA-256排霉,SHA-384SHA-512窍株。 數(shù)字表示摘要大小。 其不安全(Insecure)的容器提供SHA-1160位)和MD5128位),以便與較早的服務(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的圖像:

Data is baby Harry Potter image

當(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位摘要。 使用其他兩種哈希算法之一 SHA384SHA512一樣容易腾么。 而且奈梳,如果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按鈕以很好地了解摘要:

CryptoKit SHA256 digest of data

這是一個(gè)元組健霹。 不太可讀。

鍵入以下行以顯示其description

String(describing: digest)

注意:Apple的文檔不建議直接調(diào)用.description瓶蚂。

運(yùn)行playground糖埋。 點(diǎn)擊顯示結(jié)果:

String description of CryptoKit digest

摘要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é)果:

CryptoKit digests of almost-identical data are very differen

請(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)建簽名岂丘。

Diagram of Hashed Message Authentication Code

這就是算法的作用。 但是眠饮,要使用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é)果以查看簽名的描述:

Description of CryptoKit HMAC 512-bit signature

您已經(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é)果:

CryptoKit authenticating HMAC signature and data

HMAC可讓您驗(yàn)證發(fā)件人的身份和數(shù)據(jù)的完整性丸相,但不對(duì)數(shù)據(jù)進(jìn)行加密搔确。如果您忘記使用TLS驶鹉,而Voldemort截取了傳輸信息迄汛,他會(huì)懷疑Harry是他的靈魂之一。

或者趾浅,Voldemort可能決定手動(dòng)加密他的魂器清單弛作,以確保DumbledoreHarry找不到并銷(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è)密封的盒子里源梭。

有兩種常用的AEADAdvanced Encryption Standard Galois/Counter Mode (AES-GCM)ChaCha20-Poly1305娱俺。兩者都是Apple加密API的新功能。 AES-GCMNIST建立的標(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硬件社牲。

AESChaCha20是密碼算法。 GCMPoly1305MAC算法悴了。伯恩斯坦(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ù):

Diagram of CryptoKit Sealed Box seal operation

這看起來(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

CryptoKit code for ChaChaPoly seal and open operations

注意SealedBoxData的大小比圖像數(shù)據(jù)大28個(gè)字節(jié)。 添加這些行以查看密封框盒還有什么:

sealedBox.nonce  // 12 bytes
sealedBox.tag  // 16 bytes
Sizes and contents of CryptoKit sealed box nonce and tag

兩種算法都會(huì)為您選擇一個(gè)隨機(jī)數(shù)报慕,然后將其打包到密封的盒子中以供使用深浮。 太簡(jiǎn)單! 16字節(jié)tag是加密的密鑰摘要 - 驗(yàn)證數(shù)據(jù)的簽名眠冈。 每次創(chuàng)建密封盒時(shí)飞苇,隨機(jī)數(shù)都會(huì)更改,這也會(huì)更改加密的密鑰摘要蜗顽。 因此布卡,您的實(shí)際noncetag值與我的屏幕截圖不匹配。

最后雇盖,為了證明無(wú)法查看加密數(shù)據(jù)忿等,請(qǐng)?zhí)砑右韵滦校?/p>

let encryptedData = sealedBox.ciphertext
UIImage(data: encryptedData)
UIImage(data: decryptedData)

運(yùn)行playground,查看以下行:

Encrypted data cannot be viewed as UIImage

這樣就很容易發(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ǔ)在KeychainSecureEnclave中,然后在服務(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密鑰小得多:例如启具, 256ECC公鑰與3072RSA公鑰相當(dāng)。

CryptoKit僅使用ECC算法珊泳。您可以在此處選擇NISTP256 / P384 / P521Daniel J. BernsteinCurve25519鲁冯。 P256是迄今為止使用最廣泛的曲線(xiàn)。這是OpenSSL的默認(rèn)曲線(xiàn)色查,稱(chēng)為prime256v1薯演。 P384的計(jì)算量是P2562-3倍。美國(guó)國(guó)家安全局(NSA)要求使用P384保護(hù)絕密信息秧了。 P256P384位于NSASuite B Cryptography中跨扮,但P521沒(méi)有,而且我找不到有關(guān)誰(shuí)使用它的任何信息示惊。超級(jí)驚嚇吧好港?

注意:在2018年,NSACommercial 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_DRBGP256都依賴(lài)于 Nothing Up My Sleeve (NUMS)幻數(shù)塘秦。密碼學(xué)界懷疑,NSA使用特殊值來(lái)導(dǎo)出這些幻數(shù)动看,從而使它們能夠解密使用P256加密的任何內(nèi)容尊剔。 Curve25519不依賴(lài)于幻數(shù)。它的計(jì)算復(fù)雜度比P25640%菱皆。并且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)如下所示:

Graph of an elliptic curve

您可以在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臣淤。
elliptic curve A dot B operation

您還可以定義點(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)AP在哪里草描,那么他們很難計(jì)算k览绿。

實(shí)際算法僅使用xy的整數(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),如Curve25519NIST 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)證普监。

Public key cryptography: sign with private key, verify with public key

數(shù)字簽名的縮寫(xiě)是使用NISTP256 / P384 / P512曲線(xiàn)的橢圓曲線(xiàn)數(shù)字簽名算法(Elliptic Curve Digital Signature Algorithm - ECDSA)贵试,以及使用BernsteinEd25519曲線(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酸员,digest512signatureForDatasignatureForDigest發(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ù):

CryptoKit code using public key to verify private key signature

這就是進(jìn)行數(shù)字簽名的容易程度邀泉。 但是同樣,數(shù)據(jù)沒(méi)有加密。 因此汇恤,請(qǐng)繼續(xù)閱讀庞钢!

4. Creating a Symmetric Key for Encryption

在本教程的早期,DumbledoreHarry有一個(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)匠璧。

Diagram of public-private key agreement algorithm

計(jì)算共享秘密非常簡(jiǎn)單桐款。 如果G是橢圓曲線(xiàn)的生成點(diǎn),而a是鄧布利多的秘密密鑰夷恍,那么a * G是他的公鑰魔眨。 同樣,Harry的秘密密鑰是h酿雪,而他的公共密鑰是h *G遏暴。事實(shí)證明這是事實(shí):

(a * G) * h = (h * G) * a

是的,HarryDumbledore的公鑰乘以他的私鑰执虹,這與Dumbledore通過(guò)將Harry的公鑰乘以他自己的私鑰所獲得的相同拓挥。 魔法!

在這里袋励,acronymDiffie Hellman(ECDH)秘鑰協(xié)議侥啤,使用NISTP256 / P384 / P512曲線(xiàn)或BernsteinX25519曲線(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

DumbledoreHarry必須就創(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

CryptoKit derived symmetric keys match

就像是魔術(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ò)TouchIDFaceID或設(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)用程序提交到TestFlightApp 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)用程式贡定。

AppleApp Store Connect Help Export compliance overview

加密的使用包括但不限于:

  • 通過(guò)安全通道(即HTTPS赋访,SSL等)進(jìn)行調(diào)用。
  • 使用標(biāo)準(zhǔn)的加密算法。
  • 使用其他來(lái)源的加密功能蚓耽,例如iOSmacOS渠牲。
  • 使用專(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,TIAGSMA)择卦,除非另行發(fā)布敲长。

App Store Connect提供了一系列問(wèn)題App Store Connect provides a set of questions,可幫助您確定是否需要您提供出口合規(guī)性文件以及需要哪些表格秉继。

與往常一樣祈噪,您可以在源代碼中找到更多信息:

除了本教程中的(大部分為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)注~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吓坚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灯荧,更是在濱河造成了極大的恐慌礁击,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗载,死亡現(xiàn)場(chǎng)離奇詭異哆窿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)厉斟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)挚躯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人擦秽,你說(shuō)我怎么就攤上這事码荔′銮冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵缩搅,是天一觀的道長(zhǎng)越败。 經(jīng)常有香客問(wèn)我,道長(zhǎng)硼瓣,這世上最難降的妖魔是什么究飞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮堂鲤,結(jié)果婚禮上亿傅,老公的妹妹穿的比我還像新娘。我一直安慰自己瘟栖,他們只是感情好葵擎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著慢宗,像睡著了一般坪蚁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镜沽,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音贱田,去河邊找鬼缅茉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛男摧,可吹牛的內(nèi)容都是我干的蔬墩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼耗拓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拇颅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乔询,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤樟插,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后竿刁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體黄锤,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年食拜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸵熟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡负甸,死狀恐怖流强,靈堂內(nèi)的尸體忽然破棺而出痹届,到底是詐尸還是另有隱情,我是刑警寧澤打月,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布队腐,位于F島的核電站,受9級(jí)特大地震影響僵控,放射性物質(zhì)發(fā)生泄漏香到。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一报破、第九天 我趴在偏房一處隱蔽的房頂上張望悠就。 院中可真熱鬧,春花似錦充易、人聲如沸梗脾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炸茧。三九已至,卻和暖如春稿静,著一層夾襖步出監(jiān)牢的瞬間梭冠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工改备, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留控漠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓悬钳,卻偏偏與公主長(zhǎng)得像盐捷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子默勾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348