Puncte:1

Rotirea cheilor și versiunea pentru criptare în repaus

drapel jp

Lucrez cu o echipă de dezvoltatori care implementează criptarea în repaus la nivel de aplicație. Este pentru câmpuri deosebit de sensibile din interiorul unui RDB. (Stocarea DB de bază are un strat suplimentar de criptare, dar acesta este în afara subiectului aici.) Utilizăm un Spring's AesBytesEncryptor și clase aferente pentru asta.

Nu am rezolvat încă pe deplin rotația cheilor și investighez cum să o fac într-un mod sigur. Am dori să folosim un instrument separat de rotație a tastelor care ar rula izolat de aplicația care consumă datele. Acest instrument de rotație a cheilor va accesa DB asincron și va efectua recriptarea în bucăți mici. (Nu într-o singură tranzacție DB care ar recripta toate datele.)

Pentru a face acest lucru, plănuim ca aplicația să poată fi configurată cu mai multe (ei bine, două) chei în același timp. Ar folosi întotdeauna prima cheie pentru a cripta datele noi. Dar ar putea decripta datele vechi cu oricare dintre chei, în funcție de dacă instrumentul de rotație a cheilor a re-criptat deja câmpul respectiv.

Acum întrebarea este dacă trebuie să stocăm metadate suplimentare de versiuni ale cheilor în DB? Aceasta ar spune aplicației ce cheie de decriptare să folosească pentru orice bucată de date.

Sper să ocolesc asta bazându-mă în schimb pe o sumă de verificare a formularelor. Aplicația ar încerca doar cheile de decriptare pe rând, până când obține o valoare decriptată care nu rupe suma de control.

Imho, AesBytesEncryptor de la Spring ar putea să ofere deja tot ceea ce avem nevoie. Dar fiabilitatea va depinde de modul pe care îl folosim. Iată părerile mele despre cele două moduri acceptate:

  • Modul AES/CBC/PKCS5Padding: Nu are o sumă de control per-se, dar umplutura se va rupe probabil când încercați decriptarea cu cheia greșită. Totuși, aceasta depinde de dimensiunea căptușelii, care depinde de dimensiunea datelor de text simplu. În cel mai rău caz, ar putea exista doar 1 octet de umplutură. Așadar, șansele de a atinge umplutura corectă cu cheia de decriptare greșită ar putea fi de până la 1/256. Asta pare prea riscant pentru a te baza.

  • Mod AES/GCM/NoPadding: Aici „eticheta de autentificare” GCM servește ca o formă de sumă de control. Din câte am înțeles, este întotdeauna 128 de biți (16 octeți) pentru AES. Aceasta înseamnă că șansele de a atinge o etichetă de autentificare validă cu cheia de decriptare greșită sunt de aproximativ 1/(2^128).Asta practic nu este niciodată, așa că cred că ar trebui să fie potrivit pentru aplicația noastră.

Sunt corecte ipotezele de mai sus? Ce am greșit?

Crezi că este suficient de robust pentru a încerca mai multe chei de decriptare pe rând în timpul rotației cheilor, când folosești AES/GCM/NoPadding? Sau trebuie să stocăm informațiile de versiuni ale cheilor alături de datele criptate până la urmă?

Sau, există o modalitate și mai bună de a rezolva rotația cheilor în scenariul nostru?

SAI Peregrinus avatar
drapel si
Trebuie să rotiți cheia de criptare a datelor (DEK)? Modul obișnuit este de a avea două chei: o cheie de criptare a datelor care nu se modifică niciodată și nu este niciodată stocată. Aceasta este criptată cu o „cheie de criptare a cheii” (KEK) și acea valoare criptată (și KEK) este stocată. Pentru a roti cheile, decriptați DEK-ul (în RAM, ca de obicei) folosind vechiul KEK, apoi îl criptați folosind noul KEK și stocați acel text cifrat. Acest lucru se poate face într-o singură tranzacție de bază de date.
meeque avatar
drapel jp
Da, ne propunem o abordare KEK/DEK. Cu toate acestea, există multe arome diferite, de ex. când vine vorba de [granularitate](https://cloud.google.com/kms/docs/envelope-encryption#balancing_deks_and_keks). Sau dacă și cum trebuie rotit KEK/DEK. Am ajuns la concluzia că ar trebui să fim capabili să rotim atât KEK-urile, cât și DEK-urile. Și cred că această întrebare este relevantă pentru oricare dintre ei. De aceea am încercat să evit subiectul KEK/DEK. Acestea fiind spuse, dacă cineva vrea să mă răzgândesc, aș putea pune o întrebare separată pentru asta... Oricum, aș dori totuși un feedback despre acesta :)
meeque avatar
drapel jp
Mai vrea cineva să încerce întrebarea inițială?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.