SSP 릴레이가 볼 수 있는 것과 볼 수 없는 것

·6분 읽기·작성자: SSP Editorial Team
SSP Academy 표지: SSP 릴레이 서버가 볼 수 있는 것

SSP 릴레이가 볼 수 있는 것과 볼 수 없는 것

SSP는 두 기기 지갑입니다. 브라우저 확장이 한 키를, 휴대전화가 다른 키를 쥐며, 어느 쪽도 혼자서는 자금을 옮길 수 없습니다. 그러나 그 두 기기는 서로 이야기해야 하고, 그 일을 우리가 운영하는 릴레이라는 서버를 통해 합니다.

그 서버는 불편한 물음을 던지기에 알맞은 자리입니다. 모든 것이 지갑 회사가 운영하는 기반 시설을 거친다면, 그 회사는 정확히 무엇을 보는가?

정당한 물음이고, 안심시키는 답이 아니라 구체적인 답을 받을 자격이 있습니다. 그러니 코드에 실제로 들어 있는 것을 보이겠습니다.

릴레이는 아무것도 서명할 수 없다

가장 중요한 대목부터 시작하겠습니다.

릴레이는 개인 키를 결코 받지 않습니다. 암호화된 형태로도, 쪼갠 형태로도, 어떤 형태로도요. 지갑 키는 브라우저 확장에 남고 키 앱의 키는 휴대전화에 남으며, 네트워크를 건너는 것은 공개 키와 서명되지 않은 데이터, 그리고 이미 당신의 기기에서 만들어진 서명뿐입니다.

이는 정책상의 약속이 아니라 구조상의 약속입니다. 둘 중 둘 다중 서명은 자금을 옮기려면 두 서명을 모두 요구하고, 릴레이는 그 어느 키도 갖고 있지 않습니다. 완전히 악의적인 릴레이 — 우리 것이든, 장악당한 것이든, 공격자가 바꿔치기한 것이든 — 도 여전히 유효한 거래를 만들 수 없습니다. 만들려면 그에게 결코 보내지지 않은 비밀이 필요하기 때문입니다.

그것이 보장입니다. 아래의 모든 내용은 릴레이가 실제로 다루는 것에 관한 이야기입니다. 더 좁지만 정말로 비어 있지는 않은 집합이죠.

무엇이 지나가고, 얼마나 머무는가

릴레이는 네 종류의 기록을 보관합니다. 그중 둘은 스스로 지워집니다.

동기화 데이터. 두 기기를 짝지을 때의 것입니다. 체인, 당신의 지갑 신원, 키 앱의 확장 공개 키, 그로부터 나온 WK 신원, 공개 논스, 생성된 주소, 그리고 서명이 딸린 복구용 xpub를 나릅니다.

액션 데이터. 무언가에 서명할 때의 것입니다. 체인, 파생 경로, 당신의 WK 신원, 액션 종류, 페이로드 자체, 그리고 해당 UTXO를 나릅니다.

두 컬렉션 모두 MongoDB에 expireAfterSeconds: 900으로 설정된 TTL 인덱스를 가집니다. 십오 분. 다른 무슨 일이 있든 데이터베이스가 그 기록을 지웁니다 — 누군가 잊지 않고 돌려야 하는 청소 작업이 아니고, 개인정보 방침 속의 약속도 아닙니다. 인덱스이고, 데이터베이스 자신이 강제합니다.

푸시 알림 토큰. 승인할 것이 생겼을 때 휴대전화를 깨우기 위한 것입니다. 이것들은 남습니다. 십오 분마다 만료되는 알림 토큰은 쓸모가 없을 테니까요.

복구용 xpub. 신원마다 하나, 만료가 아예 없습니다. 이는 의도된 것이고 코드가 그렇게 말합니다. 두 앱이 우연히 함께 깨어 있는 짧은 순간뿐 아니라, 지갑이 필요할 때면 언제든 가져갈 수 있도록 존재합니다.

우리가 솔직해야 할 대목

그 동기화 페이로드를 다시 보십시오. 거기에 확장 공개 키가 들어 있습니다.

xpub는 지출 키가 아니고 거래를 승인할 수 없습니다. 그러나 아무것도 아닌 것도 아닙니다. 계정 xpub에서는 그 계정이 앞으로 쓸 모든 주소를 끌어낼 수 있고, 그러니 그것을 쥔 사람은 그 체인의 잔액과 거래 이력 전체를 지켜볼 수 있습니다. 그 계정에서의 당신의 금전 생활에 대한 읽기 권한입니다 — 체인 위 프라이버시가 피함으로써 성립하는 바로 그 연결이죠.

액션 페이로드도 그만큼 실질적입니다. 당신이 서명하는 동안 릴레이는 서명되지 않은 거래를 다룹니다. 돈이 어디로, 얼마나, 어떤 출력에서 나가는지를요.

그러니 정직한 요약은 "릴레이는 아무것도 보지 못한다"가 아닙니다. 이것입니다.

릴레이는 당신의 돈을 쓸 수 없고, 한 번에 십오 분 동안 당신이 그 돈으로 무엇을 하는지 볼 수 있다.

십오 분이라는 창이 완화책이고, 의미 있는 완화책입니다 — 한 곳에 얼마나 많은 이력이 쌓일 수 있는지를 묶어 둡니다. 그러나 그 창 동안 데이터는 거기 있고, 우리는 "비수탁"이라는 말이 벌지 못한 수사적 노동을 하게 두느니 그것을 분명히 말하는 쪽을 택합니다.

빌려 갈 값어치가 있는 설계 원칙

복구 서비스에 어떤 도해보다 구조를 잘 담아낸 주석이 하나 있습니다.

지갑은 그 서명을 자신이 직접 끌어낸 신원 공개 키에 대고 검증한다. 따라서 이 저장소는 신뢰되지 않는다.

복구용 xpub는 SSP Key가 그 위에 만든 분리 서명과 함께 보관됩니다. 지갑이 그것을 가져올 때, 지갑은 신원 공개 키를 독립적으로 끌어내고 서명을 스스로 확인합니다. 릴레이가 다른 xpub를 돌려준다면 — 장악이든 결함이든 고의적 바꿔치기든 — 서명이 검증되지 않고 지갑이 거부합니다.

릴레이에 기대는 소프트웨어는 릴레이를 신뢰하지 않는 관으로 취급합니다. 자신이 운영하는 기반 시설 위에 무언가를 세울 때 그것이 옳은 방식입니다. 자기 서버가 틀리더라도 그것이 이용자의 문제가 되지 않는다는 뜻이니까요. 어떤 지갑을 평가할 때든 찾아야 할 형태이기도 합니다. "그들이 얌전히 굴겠다고 약속하는가"가 아니라 "그들의 서버가 얌전하지 않으면 무슨 일이 벌어지는가".

적대적인 릴레이가 실제로 할 수 있는 일

진짜 위협 모형에 대해서는 구체적인 편이 좋습니다.

관찰할 수 있습니다. TTL 창 안에서 당신의 xpub와 대기 중인 거래를요. 그것은 프라이버시 노출이지 절도 위험이 아닙니다.

검열할 수 있습니다. 기기 사이의 메시지 전달을 거부해, 평소 흐름으로 새 거래에 서명하지 못하게 만드는 것이죠. 성가시고 지장을 주는 일이며 — 무언가를 잃는 것과는 다릅니다. 키는 여전히 당신 것이고, 자금은 여전히 체인 위에 있으며, 복구 경로는 바로 릴레이가 없을 수도 있기 때문에 존재합니다.

거짓말할 수 있고, 대개 실패합니다. 복구용 xpub 바꿔치기는 위에서 설명한 서명 확인에 막힙니다. 그 검증이 중요한 까닭이 이것입니다.

서명은 못 합니다. 키가 없으면 서명도 없고, 거래도 없습니다.

현실적인 최악은 감시와 지장이지 손실이 아닙니다. 수탁 서비스 — 거기서의 대응하는 최악은 돈이 사라지는 것입니다 — 보다 뚜렷이 나은 처지입니다. 그것은 "아무도 아무것도 볼 수 없다"와 같지 않고, 이 둘을 뒤섞는 것이야말로 사람들이 자기 프라이버시에 대해 거짓된 그림을 갖게 되는 경로입니다.

드러난 부분에 대해 할 수 있는 일

짝짓기가 무엇을 드러내는지 이해하십시오. 어떤 체인을 동기화한다는 것은 그 체인의 xpub가 릴레이를 거친다는 뜻입니다. 두 기기 설계가 애초에 작동하기 위한 값입니다.

창이 짧지만 영은 아님을 기억하십시오. 액션당 십오 분은 상한이지 부재가 아닙니다.

복구용 xpub를 영구한 것으로 여기십시오. 설계상 만료 없이 보관되고, 검증 가능한 서명이 딸린 공개 키 자료입니다 — 그러나 오래갑니다. 나중에 발견하기보다 알아 두어야 할 일입니다.

보증이 아니라 구조를 판단하십시오. 어떤 지갑의 서버에 대해 쓸모 있는 물음은 그 회사가 신중함을 약속하느냐가 아닙니다. 서버가 거짓말을 했을 때 소프트웨어가 알아차리겠느냐입니다. 우리 것은 응답을 믿는 대신 서명을 확인하고, 그것은 우리 말을 믿는 대신 코드에서 읽을 수 있습니다.

가장 이해되었으면 하는 것은 이 맞바꿈의 모양입니다. 두 기기 지갑에는 조율 통로가 필요하고, 조율 통로란 메타데이터가 모이는 자리입니다. 우리는 데이터베이스가 강제하는 만료로 그것을 묶어 두었고 클라이언트가 서버를 의심하도록 설계했습니다 — 그러나 정직한 판본은, 릴레이가 실재하는 것들을 잠깐 본다는 것이고, 아무리 세심한 구조도 그 숫자를 영으로 만들지는 못한다는 것입니다.

이 글 공유하기

관련 글