sql >> Database teknologi >  >> RDS >> PostgreSQL

Sikker metode til at gemme/hente en PGP privat nøgle og adgangssætning?

(Bemærk:Jeg er ingen sikkerhedsekspert. Jeg har en interesse i området, men det er det. Husk det.)

Hvis det er muligt, skal du slet ikke gemme adgangskoder

Det afhænger meget af, hvad dine behov er. Den bedste mulighed af alle er slet ikke at bruge to-vejs kryptering; hvis du kun kan gemme saltet og one-way-hashed password digests, der er ideelt. Du kan stadig teste dem for at se, om de matcher en adgangskode fra brugeren, men du gemmer den aldrig.

Endnu bedre, hvis dine klienter bruger en fornuftig protokol (dvs. ikke HTTP som almindeligt implementeret), kan du bruge en udfordring-svar-godkendelsesmekanisme det betyder, at din app aldrig aldrig skal se brugerens adgangskode, ikke engang når de godkendes. Desværre er dette sjældent muligt på det offentlige web, som har sikkerhed, der ville gøre 80'er-programmører til skamme.

Hvis du skal gemme adgangskoden, skal du isolere nøglerne fra appen

Hvis du skal være i stand til at dekryptere adgangskoderne, bør du ideelt set ikke have alle detaljerne til at gøre det på ét sted, og bestemt ikke ét kopierbart, let tilgængeligt sted.

Af den grund ville jeg personligt foretrække ikke at bruge PgCrypto (som du gør) til dette formål, fordi det tvinger dig til at afsløre den private nøgle og (hvis den har en) adgangssætning til serveren, hvor den kunne blive eksponeret i PostgreSQL's logfiler eller på anden måde potentielt sniffet. Jeg vil gerne lave min kryptoklientside, hvor jeg kunne bruge PKCS#11, en nøgleagent eller andre værktøjer, der lader mig dekryptere dataene uden nogensinde at have min kode i stand til at få adgang til nøglen.

Problemet med sikker nøglelagring er en del af PKCS#11 blev opfundet til. Det giver en generisk grænseflade, så applikationer og kryptoudbydere kan tale med alt, der kan levere visse signerings- og dekrypteringstjenester uden nogensinde at afsløre nøglen . Den sædvanlige, men ikke kun, brug er med hardwarebaseret krypto som smart cards og hardware kryptomoduler. Sådanne enheder kan få besked på at signere eller dekryptere data, der sendes til dem, og kan gøre det uden nogensinde at afsløre nøglen. Hvis det er muligt, så overvej at bruge et smartcard eller HSM. Så vidt jeg ved, kan PgCrypto ikke bruge PKCS#11 eller andre HSM'er/smartcards.

Hvis du ikke kan gøre det, kan du sandsynligvis stadig bruge en nøglestyringsagent, hvor du indlæser din nøgle i et nøglestyringsprogram manuelt, når serveren starter, og nøglestyringsprogrammet giver en PKCS#11 (eller en anden) grænseflade til signering og dekryptering via en socket. På den måde behøver din webapp slet ikke at kende nøglen. gpg-agent kan kvalificere sig til dette formål. Igen, så vidt jeg ved, kan PgCrypto ikke bruge en nøgleadministrationsagent, selvom det ville være en fantastisk funktion at tilføje.

Selv en lille forbedring kan hjælpe. Det er bedst, hvis adgangssætningen til din nøgle ikke er gemt på disken, så du kan kræve, at den indtastes, når appen startes, så nøglen kan dekrypteres. Du gemmer stadig den dekrypterede nøgle i hukommelsen, men alle detaljerne til at dekryptere den er ikke længere på disken og nemme at få fat i. Det er meget sværere for en angriber at stjæle den dekrypterede nøgle fra hukommelsen end at få fat i en "password.txt" fra disken.

Hvad du vælger at gøre, afhænger meget af detaljerne i dine sikkerhedsbehov og de data, du arbejder med. I din situation ville jeg bare ikke gemme adgangskoderne, hvis det overhovedet var muligt, og hvis jeg skulle, ville jeg gerne bruge en PKCS#11-kompatibel hardwareenhed.



  1. MySQL. Vælg årrække

  2. Python MySQL-konnektor returnerer bytearray i stedet for almindelig strengværdi

  3. java -postgresql sidst indsatte id ved indsættelse får ikke

  4. Sådan indstilles forbindelsesstreng med Entity Framework