CryptoKit 기반: 완벽한 암호화

응용 프로그램을 구축하는 회사와 개발자에게 안전성은 주요 문제일 수 있으며 특히 데이터 유출이 심각한 처벌을 받는 의료 분야에서 특히 문제가 될 수 있다.이것이 바로 끝에서 끝까지 암호화가 작용하는 곳이다.
이 안내서에서 애플 자체의 CryptoKit 프레임워크를 어떻게 사용하여 iOS, macOS, 기타 애플 제품, 심지어 Linux의 Swift 응용 프로그램에서 기본적인 단말기부터 단말기까지의 암호화 절차를 실현하는지 배울 것입니다.

암호화 키트란?


CryptoKit is a new Swift framework that makes it easier and safer than ever to perform cryptographic operations, whether you simply need to compute a hash or are implementing a more advanced authentication protocol.


엔드 투 엔드 암호화란 무엇입니까?


End-to-end encryption is a system of communication where the only people who can read the messages are the people communicating. No eavesdropper can access the cryptographic keys needed to decrypt the conversation—not even a company that runs the messaging service.


뭘 드시겠어요?


CryptoKit는 다음 플랫폼에서 사용할 수 있습니다.
  • iOS 13.0+
  • macOS 10.15+
  • Mac 촉매제 13.0+
  • tvOS 13.0+
  • watchOS 6.0+
  • Linux(asSwift Crypto)
  • 1단계: 키 쌍 생성


    암호화 키 쌍은 끝에서 끝까지 암호화하는 핵심입니다. 공개 키는 누군가를 위해 데이터를 암호화하는 데 사용되며, 개인 키는 암호화된 데이터를 복호화하는 데 사용됩니다.응용 프로그램의 모든 사용자는 키 쌍이 있어야 하며, 그 키는 사용할 수 있다
    신뢰할 수 있는 서비스에서 다른 사용자가 받을 수 있고 장치에 있는 개인 키 stored securely 가 있습니다.Trusted Services는 SwiftVapor 또는 사용자가 선택한 다른 언어와 프레임워크를 사용하여 작성할 수 있습니다.
    우선 개인 키를 생성한 다음 관련 키를 추출하여 신뢰할 수 있는 서비스로 보낼 것입니다.본 지침에서 우리는 Curve25519 알고리즘을 사용하지만 다른 알고리즘의 작업 원리는 유사해야 한다.
    import CryptoKit
    
    // generate key pair
    let privateKey = Curve25519.KeyAgreement.PrivateKey()
    let publicKey = privateKey.publicKey
    
    // publish public key in trusted service
    TrustedService.publishKey(publicKey, for: myIdentity)
    
    공개 키는 신뢰할 수 있는 서비스의 유효 부하에 서열화하는 데 사용할 수 있는 var rawRepresentation: Data 속성이 있습니다.

    2단계: 데이터 암호화


    사용자 (수신자) 를 위해 데이터를 암호화하려면 먼저 신뢰할 수 있는 서비스에서 그들의 공개 키를 가져와야 한다.
    let recipientPublicKey = TrustedService.fetchPublicKey(of: recipientIdentity)
    
    초기 값 설정 항목 Curve25519.KeyAgreement.PublicKey(rawRepresentation: Data) 은 신뢰할 수 있는 서비스에서 온 키를 반서열화하는 데 사용할 수 있습니다.

    2.1단계: 대칭 키 내보내기


    공개 키는 데이터를 암호화하는 데 직접 사용할 수 없습니다.그것들은 통신 쌍방이 Diffie-Hellmann key agreement 암호화에 사용할 대칭 키를 합의하는 데 사용된다.이를 위해, 우리는 발송자의 개인 키와 수신자의 공공 키를 사용하여 공유 키를 생성할 것입니다. 그 중에서 우리는 HKDF 키 파생 함수를 사용하여 대칭 키를 파생할 수 있습니다.
    let sharedSecret = try! privateKey.sharedSecretFromKeyAgreement(with: recipientPublicKey)
    let symmetricKey = sharedSecret.hkdfDerivedSymmetricKey(using: SHA256.self,
                                                            salt: protocolSalt,
                                                            sharedInfo: Data(),
                                                            outputByteCount: 32)
    
    프로토콜salt는 대칭 키의 파생 결과를 바꾸는 값입니다.용례에 변하지 않는 옵션을 선택하십시오. 예를 들어: "My Key Agreement Salt".data(using: .utf8)!

    2.2단계: 대칭 키로 데이터 암호화


    이제 우리는 마침내 대칭 키를 사용하여 암호화를 실행할 수 있게 되었다.이 작업은 CryptoKit에서 지원하는 암호 하나로 완료할 수 있습니다.ChaChaPoly 및 기타 연구진의 견해에 따르면 이 안내서에서 우리는 Adam Langley를 사용할 것이다. 이 안내서는 모바일 기기에서 AES의 3배 속도가 될 수 있다.
    let sensitiveMessage = "The result of your test is positive".data(using: .utf8)!
    let encryptedData = try! ChaChaPoly.seal(sensitiveMessage, using: symmetricKey).combined
    
    encryptedData 이제 수신자에게 안전하게 발송할 수 있습니다.

    3단계: 데이터 복호화


    수신한 데이터를 복호화하려면 수신자가 암호화하는 데 사용할 동일한 대칭 키를 받아야 한다.그러나 내보내기 전에 발송자의 공개 키가 필요합니다.
    let senderPublicKey = TrustedService.fetchPublicKey(of: senderIdentity)
    

    단계 3.1: 대칭 키 내보내기


    대칭 키를 유도하기 위해서, 우리는 2.1단계와 같은 과정을 실행할 것입니다. 단지 지금 우리는 수신자의 개인 키와 발송자의 공개 키를 사용할 것입니다.이것은 같은 대칭 키를 파생하는 데 사용할 수 있는 공유 키를 다시 생성할 수 있도록 합니다.
    let sharedSecret = try! privateKey.sharedSecretFromKeyAgreement(with: senderPublicKey)
    let symmetricKey = sharedSecret.hkdfDerivedSymmetricKey(using: SHA256.self,
                                                            salt: protocolSalt,
                                                            sharedInfo: Data(),
                                                            outputByteCount: 32)
    
    우리는 단지 사용자 간에 대칭 키를 공유했을 뿐, 그들의 장치 이외에는 존재하지 않았다.🤯

    단계 3.2: 대칭 키로 데이터 복호화


    현재 우리는 대칭 키를 사용하여 데이터를 복호화할 수 있다.
    let sealedBox = try! ChaChaPoly.SealedBox(combined: encryptedData)
    let decryptedData = try! ChaChaPoly.open(sealedBox, using: symmetricKey)
    
    let sensitiveMessage = String(data: decryptedData, encoding: .utf8)
    print(sensitiveMessage) // "The result of your test is positive"
    
    완벽한 암호화 구현!

    기대 많이 해주세요.


    이 안내서에서 기술한 과정은 암호화라는 것을 보증한다.이것은 사용자를 위해 암호화된 데이터는 그 사용자만 복호화할 수 있다는 것을 의미한다.
    보증하지 않음: Authentication and Integrity.이것은 암호화된 데이터가 특정한 사람에게서 왔는지 확인할 수 없고 전송 과정에서 수정되지 않았다는 것을 의미합니다.따라서 당신은 어떤 형태의 man-in-the-middle공격을 받기 쉽다.
    보증하지 않음: Forward Secrecy.이것은 개인 키가 유출되면 키 소유자를 위해 암호화된 모든 데이터를 새 키를 사용하기 시작할 때까지 복호화할 수 있다는 것을 의미한다.이전에 비밀을 지키기 위한 방안은 일회용 키를 가지고 있으며, 도난당하거나 해독되면, 이 키들은 데이터의 하위 집합에만 해를 끼칠 수 있습니다.
    인증과 무결성을 보장하기 위해 앞으로 CryptoKit에서 서명을 만들고 검증하는 기능을 연구하겠습니다.기대해주세요!

    엑스트라


    스웨프트 놀이터


    나는 GitHub에 Trusted Service를 포함하지 않고 본문에서 묘사한 대체적으로 같은 절차를 따르는 Swift 놀이터를 올렸다.여기에 link의 답이 있다.깜짝 놀라게 해줘야 돼요.🌟.

    장치에 개인 키를 안전하게 저장


    애플은 이 장치의 열쇠고리를 사용하는 것을 권장한다.본문guide에 대해 상세하게 설명하였다.

    Swift 암호화란?


    Swift Crypto is an open-source implementation of a substantial portion of the API of Apple CryptoKit suitable for use on Linux platforms. It enables cross-platform or server applications with the advantages of CryptoKit.


    오류를 발견했습니까?


    비록 나는 처음부터 끝까지 암호화하는 방면에 약간의 업계 경험이 있지만, 나는 내가 전문가라고 생각하지 않는다.전화[email protected]나 트위터로 연락 주세요.
    면책 성명: 이 문장이나 일련의 문장은 엄격한 교육적인 문장이므로 전문적인 자문을 받지 않고 사용하는 것을 건의하지 않습니다.

    좋은 웹페이지 즐겨찾기