c ++ - Kryptering ved brug af brugerens adgangskode

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil kryptere en given data ved hjælp af login-brugerens adgangskode på en Windows-maskine ved hjælp af WINAPI. Jeg har været på udkig efter en funktion, der bruger et token (eller noget lignende), men jeg kunne ikke finde en.


Er der nogen der ved, hvordan man gør det?


Tak! :-)

Bedste reference


Jeg havde skrevet dette svar tidligere, men så genovervejet, da jeg ikke havde hørt om DPAPI før. Men efter nogle yderligere overvejelser vil jeg gerne tilbyde følgende udtalelse. Det vigtige forord her er, at det hele afhænger af dine behov. To modstridende muligheder kommer til at tænke på:



  1. Du ønsker at tilbyde din bruger fuldstændig beskyttelse og kryptering, som brugeren kun kan stole på, at hun vil kunne dekryptere, uanset omstændighederne.

  2. Du er en virksomheds IT-chef og har alle medarbejdere tæt på hinanden. Du vil have, at de krypterer virksomhedsdata som en del af deres workflow, så de ikke kan se hinandens data, men adminserne kan med glæde læse alle ' s data.



Hvis du er i situation (2), så stop med at læse nu og gå med DPAPI, som er velegnet til den pågældende sag. Hvis du foretrækker scenarie (1), skal du læse mit originale svar nedenfor.





Det er nok ikke en god ide. Her er hvorfor:


Den egentlige adgangskode bliver ikke gemt på systemet (medmindre du har Windows 3.11 eller noget lignende). I stedet bliver der kun gemt et hash af adgangskoden, og ved logintidspunktet er adgangskoden, som brugeren indtaster, hashed og sammenlignet med den lagrede hash.


Så i bedste fald kan du hente den gemte hash fra systemet (hvis du har administratorrettigheder, siger). Men hvis det er det eneste tidspunkt, du kan fortsætte, vil enhver krypteringsnøgle, du laver, blive afledt af denne hash, snarere end fra den egentlige adgangskode. Således kan alle, der har adgang til systemet, komme til den lagrede hash og fra Der udledes krypteringsnøglen relativt nemt.


Kort sagt, don t. Spørg brugeren om en dedikeret, frisk adgangskode til dine data og brug den kun til det.

Andre referencer 1


Windows Data Protection API lyder som det du har brug for. Funktionerne CryptProtectData og CryptUnprotectData udfører kryptering ved brug af logon-referencer for den aktuelle bruger. [1] [2]

Andre referencer 2


brug Kerberos (Linux-baseret godkendelsesserver eller andre servere ved hjælp af Kerberos)/LDAP-ramme (Windows server) i stedet for at designe din egen login algoritme.


Windows Platform SDK & 3. partibiblioteker har forbindelser med disse rammer.


Flere oplysninger i MSDN om Kerberos: http://msdn.microsoft.com/en-us/library/ff649429.aspx[3]

Andre referencer 3


Sådan gemmes en adgangskode sikkert [4]


Win32 bcrypt: http://msdn.microsoft.com/en-us/library/aa375421\%28v=vs.85\%29.aspx[5]