windows - Hvad er en enkel måde at kryptere og dekryptere strenge med en brugerleveret adgangskode, der virker i både native Win32 og .NET?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en indbygget Win32-klientprogram og en .NET webapplikation. Jeg vil gerne kunne kryptere en streng på klienten (givet en brugerleveret adgangskode) og for at kunne dekryptere denne streng på serveren med samme adgangskode. Min klientprogram er 32-bit og min .NET webapplikationen er 64-bit. På klienten kan jeg ikke implementere .NET-rammen.


Jeg har brug for en simpel og robust løsning. Jeg mener simpelthen, at jeg foretrækker et enkelt funktionsopkald. Ved robust mener jeg, at jeg gerne vil have en industristandard krypteringsalgoritme som AES, og jeg vil ikke have hukommelselækager.


Eventuelle forslag til, hvordan jeg kan opnå dette på en enkel og robust måde?


(Måske en DLL, der kommer i både en 32-bit og en 64-bit version? Min. NET webapplikation kunne P/Invoke til det, og mit hjemlige program kunne bare bruge det.)

Bedste reference


Jeg er bange for, at der ikke er nogen 'magisk' funktion, der gør det for både din server og klienten. Det er ikke svært at skrive et simpelt krypterings-/dekrypteringsskema, der vil fungere på tværs af begge dele, da algoritmerne er standard. Din egen vilje hjælper dig også med at forstå, hvordan kryptering og dekryptering fungerer i din software.


For .NET kan du bruge navnet Navnet System.Security.Cryptography og til Win32 skal du bruge CryptoAPI. [1]


Med hensyn til krypteringsskemaet, der foregår ved brugssagen, kan du bruge et simpelt symmetrisk krypteringsskema.


Kryptering:



  1. Hash brugeradgangskoden sammen med et konstant salt for at oprette en 32-bit buffer. Du kan bruge SHA256 til dette. CryptoAPI SHA256 understøttes kun XP SP3 og opad. Ellers kan du finde mange open source implementeringer online.

  2. Tag de første 16-byte som nøglen og sidste 16 som IV.

  3. Brug AES CryptoProvider i CryptoAPI til at gøre krypteringen ved hjælp af nøglen og IV.



Dekryptering: [2]



  1. og 2. vil være det samme som for kryptering. .NET har indbygget klasser til SHA256, som du kan bruge til dette. Hvis du gør disse trin, skal du give den samme nøgle som du har under kryptering.

  2. Brug klassen AesCryptoServiceProvider til at dekryptere dataene ved hjælp af tasten og IV. Se eksempel her: https://gist.github.com/1833986 (denne bruger ikke noget salt).


Andre referencer 1


Du bør nok bruge Microsofts kryptografi API. MSDN dokumentation starter her [3] [4] [5] [6]


Dette bruger crypt32.dll og er den samme DLL, der bruges under forsiden af ​​System.Security.Cryptography API i .NET. (Du kan tjekke med en IL Disassembler, som den allerede gør P/Invoke på den DLL).

Andre referencer 2


Kan det være brugerens log ind kodeord og ikke en de leverer direkte? Windows understøtter krypterende data robust under brugerne logge på credentials (dette er normalt et kodeord, men det kan være et smartkort). Når de bruges sammen med Active Directory, det er endda muligt at konfigurere adgangskode opsving muligheder.


Dette kaldes databeskyttelses-API'en. Den kan fås fra oprindelig kode via opkald dokumenteret her og fra indbygget kode via opkald her [7] [8] [9]