iOS 및 MACOS의 보안 영토를 사용하여 서명, 확인, 암호화 및 해독하십시오.
FaceId, TouchID, 장치 패스 코드 및 응용 프로그램 비밀번호를 지원합니다.
보안 프레임 워크를 사용하는 것은 약간 혼란 스러울 수 있습니다. 그래서 내가 이것을 만든 이유입니다. 예제 코드 및 안내로 사용할 수도 있거나 마이크로 프레임 워크로 사용할 수 있습니다.
Swift 3에서 SecKeyRawVerify , SecKeyGeneratePair 및 SecItemCopyMatching C API를 사용하는 방법을 알아내는 것이 까다로워졌지만 멋진 Swift 기능 덕분에 구현은 매우 간단합니다.
Sources/EllipticCurveKeyPair.swift 및 Sources/SHA256.swift 파일을 Xcode 프로젝트로 스위트하십시오.
pod EllipticCurveKeyPair github "agens-no/EllipticCurveKeyPair" 안전한 엔 클레이브에는 많은 가능성이 있습니다. 다음은 몇 가지 예입니다
iOS 10 이상에서만 사용할 수 있습니다
유스 케이스가 될 수 있습니다
더 많은 예는 데모 앱을 참조하십시오.
struct KeyPair {
static let manager : EllipticCurveKeyPair . Manager = {
let publicAccessControl = EllipticCurveKeyPair . AccessControl ( protection : kSecAttrAccessibleAlwaysThisDeviceOnly , flags : [ ] )
let privateAccessControl = EllipticCurveKeyPair . AccessControl ( protection : kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly , flags : [ . userPresence , . privateKeyUsage ] )
let config = EllipticCurveKeyPair . Config (
publicLabel : " payment.sign.public " ,
privateLabel : " payment.sign.private " ,
operationPrompt : " Confirm payment " ,
publicKeyAccessControl : publicAccessControl ,
privateKeyAccessControl : privateAccessControl ,
token : . secureEnclave )
return EllipticCurveKeyPair . Manager ( config : config )
} ( )
}다른 액세스 제어 플래그를 사용하여 Secure Enclave를 사용할 수없는 경우 Keychain을 사용하기 위해 우아하게 폴백 할 수도 있습니다.
let privateAccessControl = EllipticCurveKeyPair . AccessControl ( protection : kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly , flags : {
return EllipticCurveKeyPair . Device . hasSecureEnclave ? [ . userPresence , . privateKeyUsage ] : [ . userPresence ]
} ( ) ) 이 경우 Config 객체에서 .secureEnclaveIfAvailable 로 token 변수를 설정해야합니다.
do {
let key = try KeyPair . manager . publicKey ( ) . data ( ) . DER // Data
} catch {
// handle error
}작업 예제는 데모 앱을 참조하십시오
do {
let key = try KeyPair . manager . publicKey ( ) . data ( ) . PEM // String
} catch {
// handle error
} do {
let digest = " some text to sign " . data ( using : . utf8 ) !
let signature = try KeyPair . manager . sign ( digest , hash : . sha256 )
} catch {
// handle error
}서명 할 때 LaconText 객체를 통과 할 수도 있습니다
do {
let digest = " some text to encrypt " . data ( using : . utf8 ) !
let encrypted = try KeyPair . manager . encrypt ( digest , hash : . sha256 )
} catch {
// handle error
}공개 키를 사용하여 다른 장치/OS/플랫폼을 암호화 할 수도 있습니다. Secure Enclave가 이해하는 형식으로 암호화하는 방법에 대한 모든 세부 사항을 알고 싶다면 @dschuetz 의이 위대한 글을 읽어야합니다!
https://darthnull.org/security/2018/05/31/secure-enclave-ecies/
do {
let encrypted = ...
let decrypted = try KeyPair . manager . decrypt ( encrypted , hash : . sha256 )
let decryptedString = String ( data : decrypted , encoding : . utf8 )
} catch {
// handle error
}해독 할 때 Lacontext 객체를 통과 할 수도 있습니다
가장 흔한 것은
do/catch :
do {
let decrypted = try KeyPair . manager . decrypt ( encrypted )
} catch EllipticCurveKeyPair . Error . underlying ( _ , let underlying ) where underlying . code == errSecUnimplemented {
print ( " Unsupported device " )
} catch EllipticCurveKeyPair . Error . authentication ( let authenticationError ) where authenticationError . code == . userCancel {
print ( " User cancelled/dismissed authentication dialog " )
} catch {
print ( " Some other error occurred. Error ( error ) " )
} if let :
if case let EllipticCurveKeyPair . Error . underlying ( _ , underlying ) = error , underlying . code == errSecUnimplemented {
print ( " Unsupported device " )
} else if case let EllipticCurveKeyPair . Error . authentication ( authenticationError ) , authenticationError . code == . userCancel {
print ( " User cancelled/dismissed authentication dialog " )
} else {
print ( " Some other error occurred. Error ( error ) " )
} 키 체인으로 앞뒤로 이동하는 쿼리를 검사하려면이 라이브러리가 이와 같은 키 체인에서 수행하는 모든 돌연변이를 콘솔하기 위해 인쇄 할 수 있습니다.
EllipticCurveKeyPair . logger = { print ( $0 ) } 데모 앱에서는 서명을 만들 때마다 유용한 정보가 콘솔에 로그인됩니다.
예제 출력
#! /bin/sh
echo 414243 | xxd -r -p > dataToSign.dat
echo 3046022100842512baa16a3ec9b977d4456923319442342e3fdae54f2456af0b7b8a09786b022100a1b8d762b6cb3d85b16f6b07d06d2815cb0663e067e0b2f9a9c9293bde8953bb | xxd -r -p > signature.dat
cat > key.pem << EOF
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdDONNkwaP8OhqFTmjLxVcByyPa19
ifY2IVDinFei3SvCBv8fgY8AU+Fm5oODksseV0sd4Zy/biSf6AMr0HqHcw==
-----END PUBLIC KEY-----
EOF
/usr/local/opt/openssl/bin/openssl dgst -sha256 -verify key.pem -signature signature.dat dataToSign.dat이 스크립트를 실행하려면 가능합니다
verify.shchmod u+x verify.sh./verify.sh그러면 당신은 볼 것입니다
Verified OK추신 :이 스크립트는 현재 디렉토리에 4 개의 파일을 만듭니다.
보안 프레임 워크, Swift 3, Swift 4, Swift, CedeyRawverify, AckeyGeneratePair, SecitemcoPymatching, Secp256R1, Elliptic Curve Cryptography, ECDSA, ECDH, ASN.1, IOS, MAC OS, KSECATTRKEYTYTYPEECSECSECERANDOM, KSECATTRYEPEECOPEECOPEECOPECATECATECATECATECATECATECATECSECSECPRIMERANDOM, IOS. ksecattrtokenidsecureenclave, lacontext, localauthentication, faceid, face id, touchid, touch id, 응용 프로그램 암호, 장치 핀, devicepin
TrailoFbits는 큰 도움을주기위한 몇 가지 목표 C 코드를 게시했습니다! Tidas 및 SecureClaveCrypto를 공유해 주셔서 감사합니다. 그들은 또한 다른 가장 흥미로운 프로젝트를 얻었습니다. 확인하십시오!
그는 공개 키를 적절한 der x.509 형식으로 내보내는 것과 관련하여 매우 귀중한 통찰력을 공유했습니다.
SHA256 클래스 (원래 SHA2.swift )는 Marcin Krzy 중의가 노프 스키의 귀중한 Cryptoswift 라이브러리에서 발견됩니다. 이 프로젝트에서 우리가 필요로하는 것에 대해 최소한의 최소로 줄무늬를 제거하기 위해 수업이 크게 변경되었습니다.
시뮬레이터에서 터치 ID / 장치 핀으로 프롬프트를받지 않는 이유는 무엇입니까?
시뮬레이터는 안전한 엔 클레이브를 가지고 있지 않으므로 액세스하려고 시도하면 오류가 발생합니다.
fallbackToKeychainIfSecureEnclaveIsNotAvailabletrue로 설정하면 개인 키는 시뮬레이터의 키 체인에 저장되어 시뮬레이터에서 애플리케이션을 쉽게 테스트 할 수 있습니다.
어디에서 더 배울 수 있습니까?
WWDC 2015에서 일반적으로 보안에 대해이 비디오를 확인하거나 여기를 클릭하여 Secure Enclave에 대한 섹션을 건너 뛰십시오.
왜 열거에 싸여 있습니까?
나는 필요한 파일을 Xcode로 드래그 앤 드롭으로 균형을 잡고 Carthage 및 Cocoapods와 같은 종속성 관리자를 동시에 지원합니다. 더 나은 아이디어가 있거나이 결정에 동의하지 않으면 대안에 대해 논의하게되어 기쁩니다 :)
우리는? 이 도서관에 대한 귀하의 의견을 듣습니다. 당신은 좋아하거나하지 않습니다. 개선 된 것을보고 싶은 것이 있으면 문제를 제기하십시오. 트위터와 다른 곳에서 @hfossli로 저에게 연락 할 수 있습니다. ?