Carriel English 다운로드

보안 모델 · 버전 2 · 2026년 10월 24일

캐리엘이 파우치를 닫아 두는 방법.

파우치는 iCloud 키체인에 있는 키로 잠깁니다. 파우치 암호를 더하면 그 키만으로는 아무것도 열리지 않습니다. 이 페이지는 그 뜻과, 누가 무엇을 읽을 수 있는지, 캐리엘이 지킬 수 없는 것을 설명합니다.

캐리엘 1.0부터 적용되는 설계입니다. 아직 독립 검토를 받지 않았습니다. 아직 하지 않은 것을 참고하십시오.

짧게 말하면

파우치에 넣는 모든 항목은 어디로든 가기 전에 Mac에서 봉인됩니다. 봉인된 사본은 나의 iCloud, 즉 CloudKit 비공개 데이터베이스에 있습니다. 그것을 여는 키는 Apple이 종단 간 암호화하는 iCloud 키체인을 통해 내 Mac 사이를 오갑니다. 캐리엘에는 서버가 없으며, 저희는 사용자의 항목도 키도 받지 않습니다.

파우치 암호가 없으면 캐리엘은 Apple 암호 앱처럼 Apple 계정을 믿습니다. iCloud 키체인을 복원할 수 있는 사람은 파우치를 열 수 있습니다. 파우치 암호가 있으면 그 사람은 암호도 알아야 하며, 암호를 한 번 추측하는 데도 일부러 오래 걸리게 만들었습니다.

무엇이든 꺼낼 때는 Touch ID, Apple Watch, 또는 Mac 암호를 묻습니다. 넣을 때는 묻지 않습니다.

누가 무엇을 얻을 수 있는지

누가파우치 암호가 없을 때있을 때
iCloud 키체인을 복원하는 사람: Apple 계정과 내 기기 하나의 암호를 아는 사람Apple 암호 앱과 마찬가지로 파우치의 모든 것.암호를 맞히지 않는 한 아무것도 없습니다. 추측 한 번마다 느리고 메모리를 많이 쓰는 계산이 필요하므로, 긴 암호 문구는 맞힐 수 없습니다.
기기 암호 없이 Apple 계정을 피싱한 사람봉인된 레코드와 그 크기, 시각. iCloud에 있는 것을 지울 수는 있지만 내 Mac마다 봉인된 사본이 남습니다. iCloud 키체인은 그 사람의 Mac을 받아들이지 않으므로 키를 얻지 못합니다.같습니다.
Apple, 또는 Apple에 대한 법적 요청봉인된 레코드, 덧붙인 크기, 바뀐 시각, 어느 Mac이 서명했는지. 이름과 값은 없습니다.같습니다.
잠긴 Mac을 훔친 사람FileVault가 켜져 있으면 로그인 암호 없이는 아무것도 없습니다. 그 Mac에 있는 캐리엘의 사본은 그 Mac에서만 쓸 수 있는 키로 봉인되어 있습니다.같습니다.
잠기지 않은 내 Mac 앞에 앉은 사람파우치에 든 항목의 이름. 무엇이든 꺼내려면 Touch ID, Apple Watch, 또는 암호를 묻습니다.같습니다.
내 계정으로 실행되는 악성 코드나 잘못 이끌린 AI 에이전트클립보드에 있는 동안의 복사본. 그 밖에는 답할 수 없는 확인을 통과해야 합니다.같습니다.
화면 공유와 녹화이름. 값은 보여 주는 동안에만, 그리고 일부 녹화 앱에만 보입니다.같습니다.
다운로드 파일을 바꿔치기하거나 오는 도중의 업데이트를 고친 사람없습니다. macOS는 서명이나 공증이 맞지 않는 앱을 열지 않고, 캐리엘은 LonelyDuck의 릴리스 키로 서명되지 않은 업데이트를 거부하며, 다운로드 페이지에서 SHA-256 값을 비교할 수 있습니다.같습니다.
LonelyDuck의 릴리스 키와 Developer ID를 가진 사람모든 것. 어느 앱이든 만든 쪽에 대해 그렇습니다. 릴리스 키는 Mac 한 대의 Secure Enclave에 있고, 서명할 때마다 Touch ID를 묻습니다.모든 것.
LonelyDuck, 또는 LonelyDuck에 대한 법적 요청무료 파우치라면 아무것도 없습니다. LonelyDuck에 연결하지 않기 때문입니다. 더 큰 파우치라면 구입할 때 쓴 이메일 주소와, 라이선스를 쓰는 Mac의 모델(‘MacBook Air · M2’ 같은 것이며 컴퓨터 이름은 아닙니다)과 마지막 확인 시각입니다. 파우치의 내용은 결코 없습니다.같습니다.
내 라이선스를 복사한 사람라이선스에 남은 자리가 있는 동안 자기 Mac에서 쓰는 더 큰 파우치. 파우치의 내용은 없습니다. 라이선스로는 어떤 항목도 열리지 않습니다. Mac 목록…에 라이선스를 쓰는 모든 Mac이 나오며, 해제로 뺄 수 있습니다.같습니다.

첫 줄에서 규칙 하나가 나옵니다. 파우치에 Apple 계정 자체의 복구 키가 들어 있다면, 파우치를 여는 계정이 곧 그 키로 복구하는 계정이 됩니다. 그래서 캐리엘은 파우치 암호를 더하기 전에는 그런 키를 넣지 않고 이렇게 알립니다. “파우치 암호를 먼저 더하거나, 이 키는 종이에 보관하십시오.”

키

쉽게 말하면, iCloud 키체인에 루트 키가 있고, 선택한 암호가 거기에 섞이며, 그 둘에서 파우치 키 하나가 나옵니다. 파우치 키에는 이름을 여는 쪽과 값을 여는 쪽이 있습니다. 자세히는 다음과 같습니다.

키무엇인지어디에 있는지
R, 루트무작위 256비트.iCloud 키체인의 캐리엘 전용 접근 그룹. Mac을 켠 뒤 한 번 잠금 해제하면 읽을 수 있습니다.
P, 파우치 암호선택 사항. Argon2id로 늘립니다. 메모리 256MiB, 3회 반복, 4개 레인, 128비트 솔트입니다. 캐리엘은 2,048개 단어로 된 BIP-39 목록에서 무작위로 고른 단어 여섯 개(66비트)의 암호 문구를 제안하며, 직접 정한 암호를 입력해도 됩니다.캐리엘의 네이티브 암호 입력란에서만 입력합니다. 저장하지 않습니다.
KEKR과 늘린 암호(암호가 없으면 R만)에 HKDF-SHA256을 적용하며, 파우치 ID를 솔트로, carriel/pouch/kek/v1|pw 또는 carriel/pouch/kek/v1|nopw 레이블을 씁니다.필요할 때 만듭니다. 저장하지 않습니다.
G, 파우치 키무작위. KEK로, 내 Mac마다의 Secure Enclave 키로, 그리고 복구 키를 만들었다면 복구 키로 감쌉니다.감싼 사본은 나의 iCloud에 있습니다. Mac마다 자기 사본을 갖고, 그 Mac의 Secure Enclave는 Touch ID나 암호에 답한 뒤에만 엽니다.
이름 키G에 HKDF를 적용하며 carriel/pouch/names/v1 레이블을 씁니다.Mac마다 보관하므로 목록, 검색, 동기화는 묻지 않습니다.
값 키G에 HKDF를 적용하며 carriel/pouch/values/v1 레이블을 씁니다. 공개 절반을 함께 나누는 개인 키입니다.꺼낼 때, 답한 뒤에만 엽니다.

iCloud에 있는 항목은 이름이 무작위인 레코드 하나입니다. 그 안에서 값은 HPKE(RFC 9180)로 값 키의 공개 절반에 봉인되고, 그것이 항목의 이름과 정보와 함께 이름 키로 다시 봉인되며, 크기 단계에 맞춰 덧붙인 뒤 그 항목을 쓴 Mac의 Secure Enclave 키로 서명됩니다. 고칠 때마다 새 키로 봉인합니다. 봉인에는 공개 절반만 필요하므로, 넣을 때는 캐리엘이 잠겨 있어도 묻지 않습니다.

Touch ID가 지켜지는 방식. 파우치 암호가 있으면 Mac에서 값 키에 닿는 길은 그 Mac의 Secure Enclave뿐이고, Secure Enclave는 사용자에게 묻습니다. 즉 암호학적으로 지켜집니다. 암호가 없으면 서명된 캐리엘 코드가 R에서 값 키를 만들 수 있으므로, 이때는 캐리엘의 정책이 지키며, 코드 서명과 강화된 런타임이 다른 코드를 막습니다.

새 Mac은 iCloud 키체인에서 R을 받습니다. 파우치 암호가 없으면 바로 파우치를 엽니다. 있으면 그 Mac에서 한 번 입력하거나 복구 키를 씁니다. 그 뒤로 Mac마다 자기 Secure Enclave 사본을 갖고, 파우치 키가 바뀌지 않는 한 암호를 다시 묻지 않습니다.

새 파우치 키는 파우치 암호를 켜거나 바꿀 때, 복구 키를 바꿀 때, Mac을 제거할 때 만들어집니다. 그러면 파우치의 모든 항목을 새 키로 다시 봉인하므로, 예전 키링 사본으로는 지금 보관한 것을 열 수 없습니다. 백업처럼 다른 곳에 남은 예전 레코드 사본은 만들 당시의 iCloud 키체인만큼만 안전합니다.

Mac을 제거하면 제거한 Mac이 받지 못하는 새 파우치 키를 만듭니다. 그 Mac이 아직 Apple 계정에 있으면 iCloud 키체인을 읽을 수 있으므로 계정에서도 제거하고, 잠기지 않은 채 도난당했다면 파우치 암호도 바꾸십시오. 그 Mac에서 만든 복구 키는 더 이상 쓸 수 없으므로 새로 만드십시오.

Apple이 보는 것

내 계정의 CloudKit 비공개 데이터베이스에서 레코드 수, 덧붙인 크기, 바뀐 시각, 각 레코드에 서명한 Mac을 봅니다. 레코드 이름은 무작위라서 안의 내용을 알려 주지 않습니다. 이름, 종류, 분류, 길이, 파일 이름, 값은 모두 봉인된 봉투 안에 있습니다.

파우치는 Apple의 CloudKit 암호화에 기대지 않습니다. CloudKit이 보기 전에 이미 봉인되어 있기 때문입니다. 고급 데이터 보호를 켜면 CloudKit 자체의 계층도 종단 간 암호화됩니다. 어느 경우든 iCloud 키체인, Secure Enclave, macOS 자체는 Apple을 믿어야 하며, 저희는 이를 숨기기보다 밝혀 둡니다.

그 밖에는 아무것도 이 Mac을 떠나지 않습니다. 캐리엘은 사용 데이터, 분석 정보, 충돌 보고서를 자체적으로 보내지 않으며, 사용자가 맡긴 내용을 알 수 있는 자체 서버도 없습니다. 캐리엘이 연결할 수 있는 모든 서비스는 이 Mac에서 나가는 것 페이지에 있습니다.

캐리엘이 묻는 때

하는 일Touch ID, Apple Watch, 또는 암호를 묻는지
패널이나 창 열기, 검색, 넣기묻지 않습니다.
복사, 보기, 값 편집, 사본 저장, 파일 미리 보기묻습니다. 확인 창은 하는 일과 항목을 밝힙니다. 예: “Stripe live secret 복사”.
삭제묻지 않습니다. 최근 삭제된 항목에서 30일 동안 기다립니다. 완전히 삭제하거나 최근 삭제된 항목을 비울 때는 묻습니다.
설정을 약하게 바꾸기, 파우치 암호 추가나 변경, 복구 키 만들기, Mac 제거묻습니다. 설정을 강하게 바꿀 때는 묻지 않습니다.

30초까지만. 패널이나 창이 열려 있는 동안 한 번 답하면 마지막으로 꺼낸 뒤 30초 동안 다시 묻지 않습니다. 패널을 닫거나, 창이 포커스를 잃거나, 잠자기, 화면 잠금, 사용자 전환, 화면 보호기가 시작되면 곧바로 끝납니다. Touch ID로 Mac 잠금을 해제한 것은 답으로 치지 않습니다.

두 가지 잠금 방식. 설정 › 보안에서 고릅니다. 기본값인 Mac과 함께는 여기에 적은 대로 작동합니다. Mac이 잠기면 파우치도 잠기고, 한 번 답하면 30초 동안 이어집니다. 매번은 복사하거나 볼 때마다, 방금 답했더라도 다시 묻습니다.

잠길 때. 잠자기, 화면 잠금, 사용자 전환, 종료 때 캐리엘은 모든 답과 열린 키를 잊고, 값을 보여 주거나 편집하는 패널을 닫고, 미리 보기 파일을 지우며, 클립보드에 캐리엘의 복사본이 남아 있으면 지웁니다. 이름 키는 남으므로 잠금을 해제하면 확인 없이 목록이 그대로 보입니다.

값이 평문으로 있는 곳

  • 캐리엘의 네이티브 부분. 잠깐 메모리 버퍼에 있고, Swift가 허락하는 한 쓴 뒤 0으로 지웁니다.
  • 노트나 값을 편집하는 동안의 입력란. AppKit의 텍스트 저장소는 0으로 지울 수 없으므로 패널이 닫힐 때 놓아 줍니다. 그 입력란에서는 맞춤법 검사, 자동 완성, 인라인 예측, 글쓰기 도구가 꺼져 있습니다.
  • 클립보드. 복사한 때부터 지워질 때까지 있습니다. 내 계정으로 실행되는 모든 앱이 읽을 수 있습니다.
  • 화면. 보여 주는 동안 있습니다.
  • 저장한 파일, 그리고 파일을 미리 볼 때 Quick Look이 읽는 임시 파일. 임시 파일은 미리 보기를 닫으면 지웁니다.

복사, 보기, 파일

  • 복사본은 이 Mac 전용(currentHostOnly)이므로 유니버설 클립보드가 다른 기기로 넘기지 않습니다. org.nspasteboard.ConcealedType 표시와 TransientType 표시가 붙어 있어, 이 규칙을 따르는 클립보드 관리자와 클립보드 기록은 건너뜁니다. 30초 뒤(설정에서 15, 30, 60, 90초 중 고름), 그리고 잠금, 잠자기, 화면 잠금, 종료 때 지우지만, 클립보드에 아직 캐리엘의 복사본이 있을 때만 지웁니다.
  • 값 보기는 작은 네이티브 패널을 엽니다. 고정폭 글꼴로 네 글자씩 묶고, 0과 O를 구별해 보여 줍니다. 캐리엘은 macOS에 이 패널을 스크린샷과 화면 공유에서 빼 달라고 요청하지만(sharingType = .none), 이를 무시하는 녹화 앱도 있습니다. 10초가 지나거나, 손을 떼거나, 포커스를 잃으면 닫힙니다.
  • 파일은 끌어 놓을 때 한 번 읽습니다. 일반 파일만 받고, 링크는 받지 않으며, 크기를 먼저 확인합니다. 캐리엘은 파일을 열거나 해석하거나 썸네일로 만들지 않습니다. 사본 저장은 저장 패널을 거쳐 0600 권한으로 쓰고, 내려받은 파일로 표시하므로 나중에 열 때 Gatekeeper가 확인합니다. Quick Look 미리 보기는 캐리엘 밖에서 실행됩니다.

창은 값을 갖지 않습니다

캐리엘은 두 부분으로 되어 있습니다. Swift로 만든 작은 네이티브 부분은 늘 켜져 있으며 메뉴 막대, ⌃⌥⌘V 단축키, 카드와 패널, Touch ID, 키, iCloud를 맡습니다. 창은 Electron으로 만든 별도의 앱으로, 요청할 때 열리고 닫으면 종료됩니다.

창은 로컬 연결로 네이티브 부분과 이야기하며, 이 연결은 상대가 서명된 캐리엘 앱인지 확인합니다. 창은 이름, 종류, 길이, 정보를 받고, 값, 노트의 텍스트, 파일의 바이트, 암호는 받지 않습니다. 창에서 값을 보려고 하면 네이티브 부분이 자기 패널에 보여 줍니다. 창은 파일을 끌어 놓아도 받지 않으며, “파일 추가…”는 네이티브 파일 패널을 엽니다. 캐리엘의 테스트는 모든 테스트 값에 표식을 넣고, 그 표식이 창, 로그, 봉인된 봉투 밖의 iCloud에 닿으면 실패합니다.

다운로드, 업데이트, 빌드

캐리엘은 carriel.app 사이트에서 받으며, LonelyDuck Software의 Developer ID로 서명하고 Apple이 공증했습니다. 모든 업데이트도 같습니다. 가진 앱을 확인하려면 터미널에서 codesign -dv /Applications/Carriel.app 명령을 실행하십시오. LonelyDuck Software를 뜻하는 TeamIdentifier=RD9TC9MV83 줄이 나옵니다. spctl -a -vv /Applications/Carriel.app 명령은 source=Notarized Developer ID 줄을 보여 줍니다. 다운로드 페이지에 릴리스마다의 SHA-256 값이 있습니다.

업데이트는 dl.carriel.dev 서버의 업데이트 설명에서 옵니다. LonelyDuck은 이 설명에 릴리스 키(ECDSA P-256)로 서명합니다. 이 키는 캐리엘을 릴리스하는 Mac의 Secure Enclave에 있고, 서명할 때마다 Touch ID를 묻으며, 오프라인에 보관하는 백업 키가 따로 있습니다. 캐리엘은 업데이트를 설치하기 전에 그 서명, 압축 파일의 SHA-256 값, 새 앱이 팀 RD9TC9MV83의 서명을 가졌는지, Apple의 공증, 그리고 이 Mac이 본 어떤 버전보다 새로운지를 확인하므로, 누구도 예전 버전을 다시 보낼 수 없습니다. 새 버전이 시작되지 않으면 캐리엘이 예전 버전을 되돌려 놓습니다.

샌드박스. 모든 값을 가진 캐리엘의 메뉴 막대 부분은 강화된 런타임과 함께 App Sandbox 안에서 실행되며, 스스로는 네트워크에 연결하지 않습니다. 창과 캐리엘 업데이트 도구는 강화된 런타임과 함께 샌드박스 밖에서 실행됩니다. 창은 값을 갖지 않고 메뉴 막대 부분하고만 이야기하며, 업데이트 도구는 앱을 바꿔 넣을 수 있어야 하기 때문입니다. 업데이트 도구가 연결하는 곳은 앱에 들어 있는 두 곳뿐입니다. dl.carriel.dev 서버, 그리고 라이선스를 위한 api.lonelyduck.io 서버입니다.

충돌 보고 기능도 분석 도구도 없습니다. 캐리엘이 충돌하면 macOS가 보고서를 이 Mac에 남기며(콘솔 › 충돌 보고서), 직접 보내지 않는 한 저희에게 오지 않습니다.

더 큰 파우치의 라이선스

라이선스는 LonelyDuck이 주는 한 줄의 텍스트이며, 캐리엘에 들어 있는 LonelyDuck의 키로 Ed25519(RFC 8032) 서명이 되어 있습니다. 캐리엘은 라이선스를 쓰기 전에 이 Mac에서 서명을 확인하고, 다른 앱의 라이선스나 바뀐 라이선스는 거부합니다.

  • 값처럼 다룹니다. 라이선스는 iCloud 키체인의 캐리엘 전용 접근 그룹에 보관되므로 다른 Mac도 받으며, 창, 로그, 기록, 알림에는 결코 나오지 않습니다. 창이 아는 것은 10자리 중 몇 자리를 쓰는지, Mac의 확인이 언제 끝나는지, 그리고 ‘Mac 목록…’에 나오는 각 Mac의 모델과 마지막 확인 시각뿐입니다.
  • Mac마다 자기 자리를 확인합니다. 일주일에 두 번쯤, 그 Mac만의 키(Ed25519, 이 Mac의 키체인에만 보관)로 확인하고, 30일짜리 사용 기간을 다른 상태와 함께 봉인해 둡니다. 요청과 답은 모두 메뉴 막대 부분이 만들고 확인하며, 캐리엘 업데이트 도구는 api.lonelyduck.io 서버로 전달만 합니다.
  • 사용 기간이 끝나거나 서명된 거절을 받으면(환불, 해제한 Mac) 그 Mac에서 항목 25개를 넘겨 넣는 것만 멈춥니다. 어떤 항목도 지우거나 숨기지 않으며, 모든 기능이 그대로 있습니다.

레코드 형식

아래의 모든 것은 공개된 표준으로 만듭니다. AES-256-GCM(NIST SP 800-38D), HKDF-SHA256(RFC 5869), HMAC-SHA256, P-256의 ECDSA와 ECDH(FIPS 186-4, SEC 1), HPKE(RFC 9180), 그리고 BLAKE2b(RFC 7693)를 안에 쓰는 Argon2id(RFC 9106)입니다. Argon2id와 BLAKE2b를 뺀 모두는 Apple의 CryptoKit과 Security 프레임워크가 제공하며, Argon2id와 BLAKE2b는 캐리엘이 Swift로 계산하고 RFC의 테스트 벡터로 확인합니다. 이 형식은 이 표준들을 캐리엘이 배치한 방식이며, 캐리엘만의 알고리즘이 아닙니다. 지금은 버전 2이고, 정수는 빅 엔디언입니다.

레코드(항목의 머리, 본문, Mac)는 봉투 하나입니다.

바이트내용
4CRL2
4 + n헤더의 길이와 헤더. 키를 정렬한 정규 JSON이며 평문입니다. 레코드의 종류와 무작위 이름, 리비전과 시각, 쓴 Mac, 크기 단계, 그리고 여러 조각으로 된 파일이라면 몇 번째 조각인지가 들어 있습니다.
4 + n래핑의 길이와 래핑. 새로 만든 32바이트 내용 키를 파우치 키 세대의 이름 키로 AES-256-GCM 봉인한 것이며, carriel/wrap/v2|, 헤더, 세대가 연관 데이터입니다.
12내용의 nonce.
4 + n내용 키로 AES-256-GCM 봉인한 내용이며, CRL2 표시와 헤더가 연관 데이터입니다. 봉인하기 전에 4바이트 길이, 내용, 그리고 0을 채워 2,048, 8,192, 32,768, 131,072, 524,288, 716,800바이트 가운데 맞는 가장 작은 크기로 맞춥니다(형식은 512도 알며, 참조 벡터가 이를 씁니다).
2 + n서명. 앞의 모든 바이트에 대한 SHA-256 ECDSA P-256 서명을 DER로 적은 것이며, 레코드를 쓴 Mac의 Secure Enclave 키가 서명합니다.

안에 든 것. 항목의 머리(i- 접두어와 무작위 base32 글자 26개)에는 PCH1 표시와 이름과 정보의 JSON이 있습니다. 본문(b-…, 파일이라면 16조각까지)에는 PCB1 표시와, 값 키의 공개 절반에 HPKE 기본 모드(DHKEM(P-256, HKDF-SHA256), HKDF-SHA256, AES-256-GCM)로 다시 봉인한 값이 있으며, info는 carriel/pouch/value/v1 문자열이고 파우치, 항목, 레코드, 값의 세대가 연관 데이터입니다. Mac(d- 접두어와 그 ID)에는 PCD1 표시와 이름, 날짜가 있습니다. 리비전마다 새 내용 키와 nonce를 쓰며, 파일의 조각은 리비전이 모두 같고 저마다 서명을 가져야 하나라도 열립니다.

키링(d-keyring)은 형식이 따로 있습니다. CPK1 표시, 그리고 파우치 ID, 키의 세대, 리비전, 쓴 Mac을 평문으로 담은 정규 JSON과 그에 대한 HMAC-SHA256, ECDSA P-256 서명입니다. R에서 나온 키로 봉인한 안쪽에는 KEK로 감싼 G, Mac마다의 Secure Enclave 키로 감싼 G, 최신 키에서 나온 키로 감싼 예전의 모든 G, 값 키의 공개 절반이 있습니다. 그 옆의 서명된 부분에는 G에서 나온 키로 감싼 R과, 복구 키를 만들었다면 그 공개 절반으로 감싼 G가 있습니다. 공개 키로 감쌀 때는 P-256 임시 ECDH, 두 공개 키를 솔트로 하고 carriel/ec-wrap/v2 문자열을 info로 하는 HKDF-SHA256, 그리고 용도에 묶인 AES-256-GCM을 씁니다. 예를 들어 파우치, 세대, Mac을 붙인 carriel/pouch/device-wrap/v1| 문자열입니다.

키만드는 방법
암호 키암호(UTF-8, NFC)에 Argon2id 버전 19를 적용합니다. 256MiB, 3회 반복, 4개 레인, 무작위 16바이트 솔트, 32바이트 출력입니다.
KEKR과 암호 키(암호가 없으면 R만)에 HKDF-SHA256을 적용하며, 솔트는 파우치 ID, info는 carriel/pouch/kek/v1|pw 또는 |nopw 문자열입니다. 파우치 ID, 세대, 방식(그리고 Argon2id 설정)을 연관 데이터로 G를 봉인합니다.
이름 키G에 HKDF-SHA256을 적용하며, 솔트는 carriel/pouch/v1 문자열, info는 carriel/pouch/names/v1 문자열입니다.
값 키G에서 HKDF-SHA256으로 48바이트를 만들고(솔트 carriel/pouch/v1, info carriel/pouch/values/v1), FIPS 186-4 B.4.1처럼 (x mod (n − 1)) + 1로 P-256 개인 키를 만듭니다.
키링의 키봉인 키는 R에 HKDF(솔트 파우치 ID, carriel/pouch/keyring/v1), HMAC 키는 이름 키에 HKDF(carriel/pouch/keyring-mac/v1), R과 예전 키를 감싸는 키는 G에 HKDF(carriel/pouch/root-wrap/v1, carriel/pouch/prev-wrap/v1)입니다.
복구 키무작위 32바이트를 BIP-39의 영어 단어 24개(8비트 SHA-256 체크섬 포함)로 적습니다. 키 쌍은 여기에 HKDF-SHA256으로 48바이트를 만들고(솔트 carriel/pouch/recovery/v1, info p256-key) 같은 방식으로 개인 키를 만듭니다.

평문으로 남는 것. CloudKit과 iCloud 데이터를 가진 사람에게 보이는 것은 레코드마다 종류, 무작위 이름, 리비전, 시각, 크기 단계, 조각 수, 쓴 Mac의 ID이고, 키링은 세대, 리비전, 복구 키가 있는지입니다. 이름, 종류, 분류, 길이, 파일 이름, 노트, 값은 모두 봉인되어 있습니다.

테스트 벡터

누구나 형식을 확인할 수 있도록 고정한 가짜 입력입니다. 실제 키, 암호, 누군가 보관하는 항목은 하나도 없습니다. 모든 래핑, 키링, 항목의 머리, 봉인한 값을 담은 전체는 vectors.json 파일입니다. 이 사이트의 테스트가 빌드할 때마다 Node의 암호 기능과 캐리엘의 TypeScript 참조 구현으로 하나하나 열어 보며, 캐리엘의 Swift 테스트는 참조 봉투를 열고 RFC 벡터를 확인합니다.

무엇값
G, 파우치 키000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
R, 루트202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f
파우치 ID00000000-0000-4000-8000-000000000001
이름 키e568e1d85e017a3cec73a6b9b49de39953fdddad8df650cbec79249a7d15661a
값 키(개인)bdb272a358217d6d0067841fb9ac59009eea9a462784231bfc5e32420b8625c3
값 키(공개)04d4ac45e0eb56e90bddbbf1848056e545bf6839c64438cb697505272dc43d2a98f42c111c98eb7b06ca139d68c6ab21771d9d7b951335d85130b50c15f7d30e38
암호 없는 KEK27347e11379338fd8745c7283d4be1222a8ef3be90a463e3920f626cfbdd23ec
“correct horse battery staple” 암호의 암호 키, 솔트 02 × 168884716d371c945e36d6b83ce6497917697e41f92ec7595f6e42988661e860b3
그 암호를 쓴 KEK0b866a3554a86e9d6d8be9bb39ff0d1c3a562ca20e950c58a2427c91d60174e2
키링의 봉인 키52ee74c6452fce35f760e45084219782166eafd6a323bc7c112e6d0bc2466313
복구 키 00 × 32의 단어abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art
그 개인 키f80408fd5bd01aeecdc81d5598337bb2e7928cc3355023b2fa2b5c476043c430
참조 봉투의 서명된 바이트의 SHA-256a43dabb1ec867d3315826564cb9bef5d28809245a07fa2a7f2d73cd7aabf1338
항목 머리의 서명된 바이트의 SHA-2564f9a2e38bde3959d79b4d5ce6282ca54c143158e7aa95e12222e12e5ae73e90d
키링의 서명된 부분의 SHA-256a64e62e98ed29aa96d3d94cbfce6b0d827429f4eb8fac54359b72584ac908f0b
봉인한 값을 열면“carriel test vector value, not a secret”

ECDSA 서명은 할 때마다 달라지므로, 벡터에는 서명을 확인할 공개 키가 함께 있습니다. 값의 HPKE 봉인도 할 때마다 새 키를 쓰므로, 그 벡터는 봉인한 값 하나와 그것을 열었을 때의 내용입니다.

캐리엘이 지킬 수 없는 것

  • 파우치 암호가 없을 때의 Apple 계정. Apple 암호 앱과 마찬가지로, iCloud 키체인을 복원할 수 있는 사람은 파우치를 열 수 있습니다. iPhone에서 도난당한 기기 보호를 켜고, Apple 계정에 보안 키를 쓰는 것도 생각해 보십시오.
  • 새 Mac이 처음 찾은 파우치. 파우치에 들어오는 Mac은 iCloud 키체인으로 열리는 첫 파우치를 믿습니다. iCloud 키체인과 iCloud 데이터를 모두 가진 사람은, 다른 Mac들이 원래 파우치를 되돌려 놓기 전에 자기 파우치를 보여 줄 수 있습니다. 이미 파우치에 있는 Mac은 그런 파우치를 받아들이지 않습니다.
  • 잊어버린 파우치 암호. 아직 파우치를 여는 Mac도 없고 복구 키도 없다면, 저희를 포함해 누구도 열 수 없습니다.
  • 클립보드. 내 계정으로 실행되는 모든 앱이 지워지기 전의 복사본을 읽을 수 있습니다.
  • 화면 녹화. 일부 녹화 앱은 값을 보여 주는 패널을 녹화합니다.
  • Mac 로그인 암호. 이 암호를 아는 사람은 Touch ID 대신 나오는 확인에 답할 수 있습니다.
  • 처음 복사한 곳. 메모나 채팅에서 복사한 키는 넣은 뒤에도 그곳에 남습니다. 캐리엘은 어디서 왔는지 알려 주므로 그곳에서 지울 수 있습니다.
  • 유출된 키. 캐리엘은 키를 발급한 서비스에서 그 키를 폐기할 수 없습니다. 유출되었을 수 있다면 그곳에서 새 키로 바꾸십시오.

아직 하지 않은 것

  • 독립 검토. 이 설계는 아직 LonelyDuck 바깥의 누구에게도 검토받지 않았습니다. 검토를 받으면 그 요약을 고치지 않고 이 페이지에 싣습니다.

문제 알리기

support@lonelyduck.io 주소로 쓰거나 security.txt 파일을 참고하십시오. 모든 보고를 읽고 한국어나 영어로 답합니다. 진짜 키, 암호, 코드는 보내지 마십시오. 문제를 이해하는 데 필요하지 않습니다.

이 페이지의 변경 사항

  • 버전 2 · 2026년 10월 24일. 캐리엘은 Mac App Store가 아닌 carriel.app 사이트에서 받습니다. 서명, 공증, 업데이트, 라이선스, 충돌 보고서에 관한 내용을 그에 맞게 고쳤습니다. 레코드 형식과 테스트 벡터를 공개했습니다.
  • 버전 1 · 2026년 10월 24일. 캐리엘 1.0을 위한 첫 판.