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 ....