Какой простой способ шифрования и дешифрования строк с помощью предоставленного пользователем пароля, который работает как в собственном Win32, так и .NET? - PullRequest
2 голосов
/ 14 февраля 2012

У меня есть собственное клиентское приложение Win32 и веб-приложение .NET.Я хотел бы иметь возможность зашифровать строку на клиенте (с учетом предоставленного пользователем пароля) и иметь возможность расшифровать эту строку на сервере, используя тот же пароль.Мое клиентское приложение 32-разрядное, а веб-приложение .NET - 64-разрядное.На клиенте я не могу развернуть .NET Framework.

Мне нужно простое и надежное решение.Проще говоря, я бы предпочел один вызов функции.Под надежным я имею в виду, что мне нужен стандартный алгоритм шифрования, такой как AES, и я не хочу утечек памяти.

Какие-либо предложения о том, как я могу сделать это простым и надежным способом?

(Возможно, DLL, которая поставляется как в 32-битной, так и в 64-битной версии? Мое веб-приложение .NET может P / Invoke к нему, а мое нативное приложение может просто использовать его.)

Ответы [ 3 ]

0 голосов
/ 14 февраля 2012

Боюсь, что нет «волшебной» функции, которая бы делала это как для вашего сервера, так и для клиента. Нетрудно написать простую схему шифрования / дешифрования, которая будет работать в обоих случаях, поскольку алгоритмы являются стандартными. Создание собственного также поможет вам понять, как шифрование и дешифрование работает в вашем программном обеспечении.

Для .NET вы можете использовать пространство имен System.Security.Cryptography, а для Win32 вы должны использовать CryptoAPI .

Что касается схемы шифрования, в зависимости от вашего варианта использования, вы можете использовать простую симметричную схему шифрования.

Шифрование:

  1. Хешируйте пароль пользователя вместе с постоянной солью, чтобы создать 32-битный буфер. Вы можете использовать SHA256 для этого. CryptoAPI SHA256 поддерживается только с XP SP3 и выше. В противном случае вы можете найти много реализаций с открытым исходным кодом в Интернете.
  2. Возьмите первые 16 байтов в качестве ключа и последние 16 в качестве IV.
  3. Используйте AES CryptoProvider в CryptoAPI для шифрования с использованием ключа и IV.

дешифрование:

  1. и 2. будут такими же, как и для шифрования. .NET имеет встроенные классы для SHA256 , которые вы можете использовать для этого. Выполнение этих шагов должно дать вам тот же ключ, который вы используете во время шифрования.
  2. Используйте класс AesCryptoServiceProvider для дешифрования данных, используя ключ и IV. Смотрите пример здесь: https://gist.github.com/1833986 (в этом соль не используется).
0 голосов
/ 14 февраля 2012

Может ли это быть логин пользователя, а не тот, который они предоставляют напрямую?Windows поддерживает надежное шифрование данных под учетными данными пользователей (обычно это пароль, но это может быть смарт-карта).При использовании с Active Directory можно даже настроить параметры восстановления пароля.

Это называется API защиты данных .Доступ к нему можно получить из собственного кода посредством документированных вызовов здесь и из собственного кода через вызовы здесь

0 голосов
/ 14 февраля 2012

Возможно, вам следует использовать Microsoft Cryptography API.Документация MSDN начинается здесь

Это использует crypt32.dll и является той же DLL, которая используется под обложкой API-интерфейсом System.Security.Cryptography в .NET.(Вы можете проверить с помощью дизассемблера IL, что он уже выполняет P / Invoke для этой DLL).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...