sql >> Database >  >> RDS >> PostgreSQL

Veilige methode voor het opslaan/ophalen van een PGP-privésleutel en wachtwoordzin?

(Opmerking:ik ben geen beveiligingsexpert. Ik heb interesse in het gebied, maar dat is alles. Houd daar rekening mee.)

Sla indien mogelijk helemaal geen wachtwoorden op

Het hangt sterk af van wat uw behoeften zijn. De beste optie is om helemaal geen tweerichtingsversleuteling te gebruiken; als je alleen gezouten kunt opslaan en one-way-hashed wachtwoord digests dat is ideaal. Je kunt ze nog steeds testen om te zien of ze overeenkomen met een opgegeven wachtwoord van de gebruiker, maar je slaat het nooit op.

Sterker nog, als uw klanten een gezond protocol gebruiken (dwz:niet HTTP zoals gewoonlijk geïmplementeerd), kunt u een challenge-response authenticatiemechanisme dat betekent dat uw app nooit ooit het wachtwoord van de gebruiker moet zien, zelfs niet bij authenticatie. Helaas is dit zelden mogelijk op het openbare web, dat een beveiliging heeft die programmeurs uit de jaren 80 te schande zou maken.

Als u het wachtwoord moet opslaan, isoleer dan de sleutels van de app

Als je de wachtwoorden moet kunnen ontsleutelen, zou je idealiter niet alle details op één plek moeten hebben, en zeker niet op één kopieerbare, gemakkelijk toegankelijke plek.

Om die reden zou ik er persoonlijk de voorkeur aan geven PgCrypto niet te gebruiken (zoals je doet) voor dit doel, omdat het je dwingt om de privésleutel en (als die er is) de wachtwoordzin te onthullen aan de server, waar deze kan worden weergegeven in PostgreSQL's logbestanden of anderszins mogelijk gesnoven. Ik zou mijn crypto-client willen doen, waar ik PKCS#11, een sleutelagent of andere tools zou kunnen gebruiken waarmee ik de gegevens kan ontsleutelen zonder dat mijn code ooit toegang heeft tot de sleutel.

Het probleem van veilige sleutelopslag maakt deel uit van wat PKCS#11 voor is uitgevonden. Het biedt een generieke interface voor applicaties en crypto-providers om te praten met alles dat bepaalde ondertekenings- en decoderingsservices kan bieden zonder ooit de sleutel ervan te onthullen . Het gebruikelijke, maar niet alleen, gebruik is met op hardware gebaseerde crypto zoals smartcards en hardware cryptomodules. Dergelijke apparaten kunnen worden gevraagd om de aan hen doorgegeven gegevens te ondertekenen of te decoderen, en kunnen dit doen zonder ooit de sleutel te onthullen. Overweeg indien mogelijk een smartcard of HSM te gebruiken. Voor zover ik weet kan PgCrypto geen gebruik maken van PKCS#11 of andere HSM's/smartcards.

Als u dat niet kunt, kunt u waarschijnlijk nog steeds een sleutelbeheeragent gebruiken, waarbij u uw sleutel handmatig in een sleutelbeheerprogramma laadt wanneer de server opstart, en het sleutelbeheerprogramma biedt een PKCS#11 (of een andere) interface voor ondertekening en decodering via een socket. Zo hoeft uw webapp de sleutel helemaal niet te kennen. gpg-agent hiervoor in aanmerking kunnen komen. Nogmaals, voor zover ik weet kan PgCrypto geen sleutelbeheeragent gebruiken, hoewel het een geweldige functie zou zijn om toe te voegen.

Zelfs een kleine verbetering kan helpen. Het is het beste als de wachtwoordzin voor uw sleutel niet op schijf is opgeslagen, dus u moet deze mogelijk invoeren wanneer de app wordt opgestart, zodat de sleutel kan worden ontsleuteld. Je slaat de ontsleutelde sleutel nog steeds op in het geheugen, maar alle details om hem te ontsleutelen staan ​​niet langer op schijf en zijn gemakkelijk te vinden. Het is veel moeilijker voor een aanvaller om de gedecodeerde sleutel uit het geheugen te stelen dan een "password.txt" van schijf te pakken.

Wat u kiest, hangt sterk af van de details van uw beveiligingsbehoeften en de gegevens waarmee u werkt. In jouw positie zou ik de wachtwoorden zo mogelijk niet opslaan, en als het moest, zou ik een PKCS#11-compatibel hardwareapparaat willen gebruiken.



  1. SQL:Zoek de volgende rij in een waar-clausule met een ID

  2. Ontwikkelingen van Azure Virtual Machine voor gebruik van SQL Server

  3. Voeg UTC/GMT-datum in Oracle-database in met Java en Spring

  4. Mysqli bind_param gebruiken met datum- en tijdkolommen?