【问题标题】:What's a simple way to encrypt and decrypt strings with a user-supplied password that works in both native Win32 and .NET?使用用户提供的密码加密和解密字符串的简单方法是什么,该密码适用于本机 Win32 和 .NET?
【发布时间】:2012-02-13 22:25:16
【问题描述】:

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

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

关于如何以简单而可靠的方式完成此任务的任何建议?

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

【问题讨论】:

    标签: .net windows cryptography


    【解决方案1】:

    恐怕没有“神奇”功能可以为您的服务器和客户端执行此操作。由于算法是标准的,因此编写一个适用于两者的简单加密/解密方案并不难。自己构建也将帮助您了解加密和解密在您的软件中是如何工作的。

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

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

    加密:

    1. 将用户密码与常量盐一起散列以创建 32 位缓冲区。您可以为此使用 SHA256。 CryptoAPI SHA256 仅支持 XP SP3 及更高版本。否则,您可以在线找到许多开源实现。
    2. 以前 16 个字节为 key,后 16 个字节为 IV。
    3. 使用 CryptoAPI 中的 AES CryptoProvider 使用密钥和 IV 进行加密。

    解密:

    1. 和 2. 将与加密相同。 .NET 为SHA256 内置了可用于此目的的类。执行这些步骤应该会为您提供与加密期间相同的密钥。
    2. 使用AesCryptoServiceProvider 类解密数据,使用密钥和IV。请参阅此处的示例:https://gist.github.com/1833986(这个不使用任何盐)。

    【讨论】:

    • 是否有任何(非 .NET)dll 可以解决使用 CryptoAPI 的所有复杂性?
    • @Troy,不确定,但这里有很多例子:stackoverflow.com/questions/4796590/…
    • @Troy,或者,如果您可以使用其他组件,可以使用 cryptopp.comchilkatsoft.com/chilkatcrypt.asp(同时具有 C++ 和 .NET,但要花钱)
    • 我找到了一个 Delphi 本机 RC2 和 .NET/C# RC2 的示例 (stackoverflow.com/questions/970114/…)。我能够让这个为我工作。适用于 .NET、Win32 和 Wine!就像发布此示例的人一样,我希望能够将其升级为使用 AES。我能够更改 Delphi CryptoAPI 以轻松使用 AES(只需更改一些参数)。但我不知道谁以兼容的方式将 .NET 端转换为 AES。
    • @Troy,您可以只使用 AESCryptoProvider。请参阅我在此处创建的示例:gist.github.com/1833986。这个不使用任何盐。
    【解决方案2】:

    您可能应该使用 Microsoft 的 Cryptography API。 MSDN 文档开头here

    这使用 crypt32.dll 并且与 .NET 中的 System.Security.Cryptography API 在封面下使用的 DLL 相同。 (您可以使用 IL 反汇编程序检查它是否已对该 DLL 执行 P/Invoke)。

    【讨论】:

      【解决方案3】:

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

      这称为Data Protection API。它可以通过调用记录在本机代码here 和本机代码通过调用here 访问

      【讨论】:

      • 密码必须直接提供。除此之外,它看起来确实是一个简单的 api!
      • 您可以将额外的熵传递给函数。这相当于使用两个密码进行加密。使用密码派生字节获取熵。
      • 解密必须能够独立于任何 Windows 登录发生。它必须能够在客户端计算机上以及通过 Web 应用程序发生。所以 DPAPI 是不行的。
      猜你喜欢
      • 2018-03-10
      • 2012-12-12
      • 2015-08-11
      • 2014-11-30
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多