使用用户提供的密码(适用于本机 Win32 和 .NET)加密和解密字符串的简单方法是什么?



我有一个本机Win32客户端应用程序和一个.NET web应用程序。我希望能够在客户端加密一个字符串(给定用户提供的密码),并能够在服务器上解密这个字符串(给定相同的密码)。我的客户端应用程序是32位的,而.NET web应用程序是64位的。在客户端上,我无法部署.NET框架。

我需要一个简单而稳健的解决方案。简单地说,我的意思是我更喜欢单一的函数调用。所谓健壮,我的意思是我想要像AES这样的行业标准加密算法,而且我不希望内存泄漏。

关于如何以简单而稳健的方式实现这一目标,有什么建议吗?

(也许是一个32位和64位版本的DLL?我的.NET web应用程序可以p/Invoke到它,而我的本地应用程序可以直接使用它。)

恐怕没有"魔术"函数可以同时为服务器和客户端执行此操作。不过,编写一个简单的加密/解密方案并不难,因为算法是标准的。构建自己的软件也将帮助您了解加密和解密在软件中的工作原理。

对于.NET,您可以使用System.Security.Cryptography命名空间,对于Win32,您应该使用CryptoAPI。

至于加密方案,根据您的用例,您可以使用简单的对称加密方案。

加密:

  1. 将用户密码与常量salt进行哈希运算,以创建32位缓冲区。您可以为此使用SHA256。CryptoAPI SHA256仅支持XP SP3及更高版本。否则,您可以在网上找到许多开源实现
  2. 将前16个字节作为关键字,将后16个字节用作IV
  3. 使用CryptoAPI中的AES CryptoProvider使用密钥和IV进行加密

解密:

  1. 和2。将与加密相同。NET为SHA256内置了类,您可以使用这些类。执行这些步骤将为您提供与加密过程中相同的密钥
  2. 使用AesCryptoServiceProvider类,使用密钥和IV对数据进行解密。请参阅此处的示例:https://gist.github.com/1833986(这个不用盐)

您可能应该使用Microsoft的Cryptography API。MSDN文档从这里开始

这使用crypt32.dll,并且与.NET中的System.Security.Cryptography API隐藏使用的dll相同。(您可以使用IL反汇编程序检查它是否已经对该dll执行p/Invoke)。

是否可以是用户的登录密码,而不是他们直接提供的密码?。Windows支持在用户登录凭据下对数据进行稳健加密(这通常是密码,但可能是智能卡)。与Active Directory一起使用时,甚至可以配置密码恢复选项。

这被称为数据保护API。它可以通过此处记录的调用从本机代码访问,也可以通过此处的调用从本地代码访问

相关内容

  • 没有找到相关文章

最新更新