iOS Elliptic curve cryptography (ECC)

kSecAttrTokenIDSecureEnclave

https://developer.apple.com/documentation/security/ksecattrtokenidsecureenclave
Secure Enclave 支持的唯一鑰匙串項(xiàng)是 256 位橢圓曲線私鑰(密鑰類型為 kSecAttrKeyTypeEC 的私鑰)芽死。 此類密鑰必須使用 SecKeyGeneratePair(::_:) 函數(shù)直接在 Secure Enclave 上生成乖仇,并將參數(shù)字典中的 kSecAttrTokenID 密鑰設(shè)置為 kSecAttrTokenIDSecureEnclave日麸。

  • 無法將預(yù)先存在的密鑰導(dǎo)入 Secure Enclave旺遮。
  • 無法導(dǎo)出使用 kSecAttrTokenIDSecureEnclave 生成的 Private Key摘完。

Secure Enclave

https://support.apple.com/en-ng/guide/security/sec59b0b31ff/web
Secure Enclave 是集成到 Apple 系統(tǒng) (SoC) 芯片 中的專用安全子系統(tǒng)。 Secure Enclave 與主處理器隔離壁晒,以提供額外的安全層,即使在應(yīng)用處理器內(nèi)核受到威脅時(shí)也能確保敏感用戶數(shù)據(jù)的安全楷拳。 它遵循與 SoC 相同的設(shè)計(jì)原則——用于建立硬件信任根的引導(dǎo) ROM、用于高效和安全加密操作的 AES 引擎以及受保護(hù)的內(nèi)存吏奸。 雖然 Secure Enclave 不包括存儲(chǔ)欢揖,但它有一種機(jī)制可以將信息安全地存儲(chǔ)在附加存儲(chǔ)上,該存儲(chǔ)與應(yīng)用處理器和操作系統(tǒng)使用的 NAND 閃存分開奋蔚。

kSecAttrKeyTypeECSECPrimeRandom

SecKeyCopyExternalRepresentation(::)

# OC:
CFDataRef _Nullable SecKeyCopyExternalRepresentation(SecKeyRef key, CFErrorRef *error)
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0));

# Swift:
func SecKeyCopyExternalRepresentation(
    _ key: SecKey,
    _ error: UnsafeMutablePointer<Unmanaged<CFError>?>?
) -> CFData?

導(dǎo)出密鑰的格式取決于密鑰的類型:
* kSecAttrKeyTypeRSA PKCS#1 format
* kSecAttrKeyTypeECSECPrimeRandom ANSI X9.63 format (04 || X || Y [ || K])

按格式導(dǎo)出 Public Key: https://github.com/DigitalLeaves/CryptoExportImportManager
or:

func createSubjectPublicKeyInfo(rawPublicKeyData: Data) -> Data {
    let secp256r1Header = Data(bytes: [
        0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
        0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00
        ])
    return secp256r1Header + rawPublicKeyData
}

// Usage
let rawPublicKeyData = SecKeyCopyExternalRepresentation(...)!
let publicKeyDER = createSubjectPublicKeyInfo(rawPublicKeyData: rawPublicKeyData)
write(publicKeyDER, to: "public_key.der")

// Test with OpenSSL
// openssl ec -pubin -in public_key.der -text -inform der

Python 接收 SecKeyCopyExternalRepresentation 導(dǎo)出的 Public Key Base64:

$ pip install cryptography

import base64
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec

remote_key_base64_str = "" # input your own public key base64 str
remote_key_bytes = base64.b64decode(remote_key_base64_str) # to byts
remote_public_key = ec.EllipticCurvePublicKey.from_encoded_point(curve=ec.SECP256R1(),data=remote_key_bytes)
print(remote_public_key)

kSecKeyAlgorithmECDSASignatureMessageX962SHA256

ECDSA 算法她混,簽名采用 DER x9.62 編碼,SHA-256 摘要由調(diào)用的函數(shù)從任意大小的輸入數(shù)據(jù)自動(dòng)生成泊碑。

Python 接收 kSecKeyAlgorithmECDSASignatureMessageX962SHA256 簽名 Base64:

original_str = "測(cè)試簽名"
remote_sign_base64_str = "" # 換為自己的簽名

remote_sign_bytes = base64.b64decode(remote_sign_base64_str) # to bytes

# if verify error, will throw an exception
remote_verify_Result = remote_public_key.verify(signature=remote_sign_bytes, 
                                                data=original_str.encode('utf-8'),
                                                signature_algorithm=ec.ECDSA(hashes.SHA256()))  

ANSI (American National Standards Institute)

ANSI(美國國家標(biāo)準(zhǔn)協(xié)會(huì))是支持美國技術(shù)標(biāo)準(zhǔn)發(fā)展的主要組織坤按。 ANSI 與行業(yè)團(tuán)體合作,是國際標(biāo)準(zhǔn)化組織 (ISO) 和國際電工委員會(huì) (IEC) 的美國成員馒过。

ANSI 負(fù)責(zé)監(jiān)督幾個(gè)歷史悠久的計(jì)算機(jī)標(biāo)準(zhǔn)的工作臭脓,包括美國信息交換標(biāo)準(zhǔn)代碼 (ASCII) 和小型計(jì)算機(jī)系統(tǒng)接口 (SCSI)。

HTTPS 證書

HTTPS 證書是一種文件腹忽。其內(nèi)容遵循 RFC 5280 定義的格式来累。這些定義以 ASN.1 表示

ASN.1 Abstract Syntax Notation One,縮寫為 ASN.1

是一種描述抽象類型和值的符號(hào)窘奏。一種用于定義文件格式或(等效)數(shù)據(jù)結(jié)構(gòu)的語言嘹锁。
例如,在 C 中你可以這樣寫:

struct point {
  int x, y;
  char label[10];
};

在 Go 中你會(huì)寫:

type point struct {
  x, y int
  label string
}

在 ASN.1 中你會(huì)寫:

Point ::= SEQUENCE {
  x INTEGER,
  y INTEGER,
  label UTF8String
}

BER着裹, Basic Encoding Rules 基本編碼規(guī)則

BER 描述了如何將每個(gè) ASN.1 類型的值表示或編碼為八位八位字節(jié)的字符串

DER领猾,Distinguished Encoding Rules 可分辨編碼規(guī)則

ASN.1 的可分辨編碼規(guī)則,縮寫為 DER骇扇,是 BER 的一個(gè)子集摔竿,并給出了一種將任何 ASN.1 值表示為八位字節(jié)字符串的方法。DER 適用于需要唯一八位字節(jié)字符串編碼的應(yīng)用程序少孝,例如在 ASN.1 值上計(jì)算數(shù)字簽名時(shí)的情況继低。DER 在 X.509 的第 8.7 節(jié)中定義。

ASN.1 的主要序列化格式是“可分辨編碼規(guī)則”(DER)韭山。它們是添加了規(guī)范化的“基本編碼規(guī)則”(BER) 的變體郁季。例如,如果類型包含 SET OF钱磅,則必須對(duì)成員進(jìn)行排序以進(jìn)行 DER 序列化。

PEM

以 DER 表示的證書通常會(huì)進(jìn)一步編碼為 PEM似枕,它使用 base64 將任意字節(jié)編碼為字母數(shù)字字符(以及“+”和“/”)并添加分隔線(“-----BEGIN CERTIFICATE----- " 和 “-----END CERTIFICATE-----")盖淡。PEM 很有用,因?yàn)樗菀讖?fù)制粘貼凿歼。

ANSI X9.62

ANSI X9.62-2005: Public Key Cryptography for the Financial Services Industry, The Elliptic Curve Digital Signature Standard (ECDSA)
ANSI X9.62-2005:金融服務(wù)行業(yè)的公鑰密碼學(xué)褪迟,橢圓曲線數(shù)字簽名標(biāo)準(zhǔn)( ECDSA )(未在線提供)冗恨。

ANSI X9.62-2005 是由金融服務(wù)認(rèn)可標(biāo)準(zhǔn)委員會(huì) X9為美國國家標(biāo)準(zhǔn)協(xié)會(huì)開發(fā)的。ANSI X9.62 定義了使用橢圓曲線數(shù)字簽名算法 (ECDSA)生成和驗(yàn)證數(shù)字簽名的方法味赃。生成和驗(yàn)證數(shù)字簽名期間使用的域參數(shù)的生成規(guī)范也包含在 ANSI X9.62 中掀抹。ECDSA 是DSA的橢圓曲線模擬。

ANSI X9.63

ANSI X9.63-2011 (R2017) Public Key Cryptography For The Financial Services Industry - Key Agreement And Key Transport Using Elliptic Curve Cryptography
金融服務(wù)行業(yè)的公鑰密碼學(xué) - 使用橢圓曲線密碼學(xué)的密鑰協(xié)議和密鑰傳輸

X.509

X.509是密碼學(xué)里公鑰證書的格式標(biāo)準(zhǔn)心俗。X.509證書已應(yīng)用在包括TLS/SSL在內(nèi)的眾多網(wǎng)絡(luò)協(xié)議里傲武,同時(shí)它也用在很多非在線應(yīng)用場(chǎng)景里,比如電子簽名服務(wù)城榛。X.509證書里含有公鑰揪利、身份信息(比如網(wǎng)絡(luò)主機(jī)名,組織的名稱或個(gè)體名稱等)和簽名信息(可以是證書簽發(fā)機(jī)構(gòu)CA的簽名狠持,也可以是自簽名)疟位。

X.509還附帶了證書吊銷列表和用于從最終對(duì)證書進(jìn)行簽名的證書簽發(fā)機(jī)構(gòu)直到最終可信點(diǎn)為止的證書合法性驗(yàn)證算法。X.509是ITU-T標(biāo)準(zhǔn)化部門基于他們之前的ASN.1定義的一套證書標(biāo)準(zhǔn)喘垂。

引用:
A Layman's Guide to a Subset of ASN.1, BER, and DER
A Warm Welcome to ASN.1 and DER
ASN.1 vs DER vs PEM vs x509 vs PKCS#7 vs ....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甜刻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子正勒,更是在濱河造成了極大的恐慌罢吃,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昭齐,死亡現(xiàn)場(chǎng)離奇詭異尿招,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阱驾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門就谜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人里覆,你說我怎么就攤上這事丧荐。” “怎么了喧枷?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵虹统,是天一觀的道長。 經(jīng)常有香客問我隧甚,道長车荔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任戚扳,我火速辦了婚禮忧便,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帽借。我一直安慰自己珠增,他們只是感情好超歌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒂教,像睡著了一般巍举。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凝垛,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天懊悯,我揣著相機(jī)與錄音,去河邊找鬼苔严。 笑死定枷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的届氢。 我是一名探鬼主播欠窒,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼退子!你這毒婦竟也來了岖妄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤寂祥,失蹤者是張志新(化名)和其女友劉穎荐虐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丸凭,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡福扬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惜犀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铛碑。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虽界,靈堂內(nèi)的尸體忽然破棺而出汽烦,到底是詐尸還是另有隱情,我是刑警寧澤莉御,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布撇吞,位于F島的核電站,受9級(jí)特大地震影響礁叔,放射性物質(zhì)發(fā)生泄漏牍颈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一晴圾、第九天 我趴在偏房一處隱蔽的房頂上張望颂砸。 院中可真熱鬧,春花似錦死姚、人聲如沸人乓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽色罚。三九已至,卻和暖如春账劲,著一層夾襖步出監(jiān)牢的瞬間戳护,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工瀑焦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腌且,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓榛瓮,卻偏偏與公主長得像铺董,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子禀晓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容