Dezvoltăm o aplicație open-source peer-to-peer, Mapeo, conceput pentru utilizatorii cu experiență tehnică scăzută (și fără e-mail sau telefon) pentru a colecta date în medii offline. Le generăm identitatea pe dispozitiv pentru fiecare proiect ca o pereche de chei public-privată folosind libsodium crypto_sign_keypair
.
Pentru a sprijini recuperarea identității în cazul pierderii dispozitivului sau al trecerii la un dispozitiv nou, dorim să folosim o singură cheie principală care este folosită ca semințe pentru toate celelalte perechi de chei. Utilizatorii vor nota această cheie și o vor introduce manual pentru a-și recupera identitatea (similar cu modul în care Bitcoin folosește listele de cuvinte BEP-39 pentru a face backup unei chei de 256 de biți).
În mod ideal, am folosi o sămânță de 256 de biți, care este ceea ce este susținut de libsodium crypto_sign_seed_keypair
și oferă multă entropie. Cu toate acestea, există câteva limitări de design:
- Listele de cuvinte BEP-39 sunt o soluție bună pentru a facilita scrierea unei chei și ar putea fi ușor să scrieți 24 de cuvinte pentru o cheie de 256 de biți, totuși sunt acceptate doar 10 limbi și acceptăm deja mai multe limbi care nu au cuvânt. liste (de exemplu, thailandeză, khmer, vietnameză).
- Majoritatea utilizatorilor noștri nu au acces la o imprimantă și sunt pe dispozitive mobile, așa că nu este o modalitate ușoară pentru ei de a-și imprima backupul cheii ca cod QR, de exemplu.
- Cea mai bună codare cu care am venit este baza 32, deoarece evită caracterele ambigue. Cu toate acestea, o cheie de 256 de biți cu un CRC de 32 de biți ar avea nevoie de 57 de caractere în baza 32. În machetele noastre de design, acesta este un șir aleatoriu copleșitor (chiar afișat în grupuri de 5 caractere) și ne temem că va duce la erori de transcriere.
- Deoarece mulți utilizatori folosesc alfabete non-latin, este posibil să fie nevoie să afișăm cheia ca numere (de ex.cifre arabe) deoarece sunt înțelese mai larg. Cu toate acestea, un număr de 256 de biți are 77 de cifre, ceea ce este greu de notat sau introdus fără eroare.
Pentru a rezolva aceste limitări, întrebarea mea este dacă o cheie de bază / master de 128 de biți ar oferi suficientă entropie pentru o securitate „destul de bună”. Este mai ușor să scrieți (30 de caractere de bază-32 cu un CRC-16 sau 44 de cifre).
Propun derivarea unei semințe de 256 de biți (pentru generarea de perechi de chei și derivarea subcheilor) prin hashing a semințelor de 128 de biți cu Argon2 (vezi libsodiu pwhash).
Îmi dau seama că acest lucru ne oferă doar 128 de biți de entropie, dar, din moment ce este hashed la 256 de biți cu Argon2, ar fi costisitor pentru forța brută.
Nu sunt un expert în securitate (s-ar putea să fi adunat asta până acum!), dar întrebarea mea este dacă această idee a unei chei de bază / master de 128 de biți este suficientă entropie pentru a face atacurile cu forță brută dificile / imposibile. Nu căutăm criptare la nivel NSA, dar suficientă pentru a preveni un atacator hotărât (eventual sponsorizat de stat) să poată face forța brută.
Este un compromis între utilizare și securitate, vrem să menținem aplicația suficient de ușor de utilizat în siguranță și să păstrăm securitatea suficient de bună și nu sunt sigur unde este echilibrul potrivit în ceea ce privește lungimea cheii / entropia.