在服务器2012上使用MS加密库-CryptCreateHash错误代码87:ERROR_INVALID_PARAMETER

詹姆斯·费雷蒂

我正在尝试在新的Windows Server 2012环境中托管Web应用程序,但是我收到一个意外错误。该代码已存在于我们的代码库中多年,并且在任何其他平台上均未遇到任何问题。

有问题的代码调用advapi32.dll的CryptCreateHash函数-Microsoft加密库。当调用函数时,我返回0表示调用失败,随后Err.LastDllError返回错误代码87,即ERROR_INVALID_PARAMETER。

就像我之前说过的那样,该代码已经在多种环境下运行了很多年,包括开发人员使用的Windows Server 2012测试机。但是,当放置在也可以运行Server 2012的实时环境中(尽管在负载平衡系统的环境中稍微复杂些),我会收到错误消息。这两个服务器都尚未更新到Windows Server 2012 R2,它正在运行现成的操作系统版本。

在使用以下方法创建隐窝提供程序的句柄之后:

CryptAcquireContext(hCryptProv, vbNullString, SERVICE_PROVIDER, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)

我使用hCryptProv调用CryptCreateHas函数。

  If CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, hHash) = 0 Then
      Dim _error As Integer = Err.LastDllError
      Throw New CryptoException("Error during CryptCreateHash. Error Code: " & _error.ToString)
  End If

从实时和开发环境将数据传递给方法的一些示例:

开发:
hCryptProv = 4966968
CALG_MD5 = 32771
hHash = 0

实时:
hCryptProv = 1587622576
CALG_MD5 = 32771
hHash = 0

尽管服务器的hCryptProv往往要大很多(可能是因为它有更多的RAM?),但看起来这两组参数基本上是相同的。

我试图使用SHA1而不是MD5,但是发生了相同的错误。

可能这是一个32/64位相关的问题,假设advapi32.dll是32bit?

任何建议,将不胜感激,谢谢。

编辑:

所需的原型:

Private Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" _
    (ByRef phProv As IntPtr, _
     ByVal pszContainer As String, _
     ByVal pszProvider As String, _
     ByVal dwProvType As Integer, _
     ByVal dwFlags As Integer) As Integer


Private Declare Function CryptCreateHash Lib "advapi32.dll" _
    (ByVal hProv As IntPtr, _
     ByVal Algid As Integer, _
     ByVal hKey As Integer, _
     ByVal dwFlags As Integer, _
     ByRef phHash As Integer) As Integer

我一直在使用的数据类型phProv,以前是Integer,我尚未使用IntPtr进行测试。我尝试使用ULong,因为这是HCRYPTPROVMSDN文档中定义数据类型的方式。

typedef ULONG_PTR HCRYPTPROV; 

这也是CryptAcquireContext在各种配置中返回的句柄的值:

LIVE 32: hCryptProv = 606412672 
LIVE 64: hCryptProv = -1480179632 
LOCAL: hCryptProv = 4966968 
DEV 32: hCryptProv = 99009648 
DEV 64: hCryptProv = 918798256 

这是从我将Integer用作数据类型时得出的,请注意实时溢出。

编辑2

这可能是固定的。现在,当我调用CryptDecrypt时,会收到错误-2146893820(NTE_BAD_LEN)。可能与*pdwDataLen变量有关。

这是方法定义:

Private Declare Function CryptDecrypt Lib "advapi32.dll" _
                              (ByVal hKey As IntPtr, _
                              ByVal hHash As IntPtr, _
                              ByVal Final As Boolean, _
                              ByVal dwFlags As Integer, _
                              ByVal pbData As String, _
                              ByRef pdwDataLen As Integer) _
                            As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

并致电:

lLength = Len(strData)
If CryptDecrypt(_hKey, 0, 1, 0, sTemp, lLength) = False Then
                Dim _error As Integer = Err.LastDllError
                Throw New CryptoException("Error during CryptDecrypt. Error Code: " & _error.ToString)
            End If
吉姆·米歇尔

如果有类型ULONG_PTR,则需要IntPtr在.NET中进行定义您还需要一个DllImportAttribute,您CryptCreateHash应该是:

Declare Auto Function CryptCreateHash Lib "advapi32.dll" _
    (ByVal hProv As IntPtr, _
     ByVal algId As Integer, _
     ByVal hKey As IntPtr, _
     ByVal dwFlags As Integer, _
     ByRef phHast As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean

另外,请确保已告知它设置了最后一个错误。在C#中,我们使用DllImportAttribute并确保SetLastError=true否则,调用Marshal.GetLastWin32Error不会返回预期的结果。

更新资料

您的CryptDecrypt原型应为:

Declare Function CryptDecrypt Lib "advapi32.dll" 
    (ByVal hkey As IntPtr, _
     ByVal hHash As IntPtr, _
     <MarshalAs(UnmanagedType.Bool)> ByVal final As Boolean, _
     ByVal flags As Integer, _
     ByVal data As Byte(), 
     ByRef dataLen As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean

您需要将字符串转换为字节数组。还要注意,该dataLen参数是字节缓冲区的长度,而不是字符串的长度。

您应该查看pinvoke.net,该站点已管理了大多数Windows API调用的原型和示例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在远程MS SQL服务器上更新数据库(EF代码优先)

来自分类Dev

服务器2012上的打印机错误

来自分类Dev

Fortran MPI-无法在新服务器上使用现有代码库

来自分类Dev

Windows 读取文件返回 ERROR_INVALID_PARAMETER 87

来自分类Dev

使用WriteFile函数会产生1(成功),但返回错误代码87

来自分类Dev

开发服务器返回响应错误代码:样板代码上的 500

来自分类Dev

在cpanel上设置python时收到503服务器繁忙错误代码

来自分类Dev

如何使用AJAX与服务器通信并在服务器上运行代码?

来自分类Dev

报表服务器无法解密用于访问报表服务器数据库中敏感或加密数据的对称密钥SSRS错误

来自分类Dev

报表服务器无法解密用于访问报表服务器数据库中敏感或加密数据的对称密钥SSRS错误

来自分类Dev

使用PHP在服务器上编译C代码

来自分类Dev

Windows上使用IPython Notebook的500服务器错误

来自分类Dev

使用Facebook登录在服务器上出现错误

来自分类Dev

无法在解析服务器上创建一个类。正在获取错误代码1-服务器内部错误...如何解决此问题?

来自分类Dev

无法在解析服务器上创建一个类。正在获取错误代码1-服务器内部错误...如何解决此问题?

来自分类Dev

RegEnumValue的错误代码87

来自分类Dev

将 EvtQuery 与 winapi crate 一起使用时,为什么会出现 ERROR_INVALID_PARAMETER?

来自分类Dev

VS2012数据库项目的TFS Build服务器错误转换为VS2015

来自分类Dev

在将代码部署到的同一服务器上设置git存储库

来自分类Dev

远程服务器上的C#数据库连接错误

来自分类Dev

从客户端在服务器上创建新存储库时,SVN颠覆错误

来自分类Dev

Laravel 5.4 上的多个数据库 SQL 服务器连接错误

来自分类Dev

Windows 2012上的CreateMutex,错误代码为ERROR_ACCESS_DENIED

来自分类Dev

在解析服务器应用程序上使用Node.js编写服务器端代码

来自分类Dev

以下代码返回什么?mssql服务器2012

来自分类Dev

在服务器上执行Java代码

来自分类Dev

仅在服务器上执行代码

来自分类Dev

仅在服务器上执行代码

来自分类Dev

使用WAMP服务器的内部服务器错误

Related 相关文章

  1. 1

    如何在远程MS SQL服务器上更新数据库(EF代码优先)

  2. 2

    服务器2012上的打印机错误

  3. 3

    Fortran MPI-无法在新服务器上使用现有代码库

  4. 4

    Windows 读取文件返回 ERROR_INVALID_PARAMETER 87

  5. 5

    使用WriteFile函数会产生1(成功),但返回错误代码87

  6. 6

    开发服务器返回响应错误代码:样板代码上的 500

  7. 7

    在cpanel上设置python时收到503服务器繁忙错误代码

  8. 8

    如何使用AJAX与服务器通信并在服务器上运行代码?

  9. 9

    报表服务器无法解密用于访问报表服务器数据库中敏感或加密数据的对称密钥SSRS错误

  10. 10

    报表服务器无法解密用于访问报表服务器数据库中敏感或加密数据的对称密钥SSRS错误

  11. 11

    使用PHP在服务器上编译C代码

  12. 12

    Windows上使用IPython Notebook的500服务器错误

  13. 13

    使用Facebook登录在服务器上出现错误

  14. 14

    无法在解析服务器上创建一个类。正在获取错误代码1-服务器内部错误...如何解决此问题?

  15. 15

    无法在解析服务器上创建一个类。正在获取错误代码1-服务器内部错误...如何解决此问题?

  16. 16

    RegEnumValue的错误代码87

  17. 17

    将 EvtQuery 与 winapi crate 一起使用时,为什么会出现 ERROR_INVALID_PARAMETER?

  18. 18

    VS2012数据库项目的TFS Build服务器错误转换为VS2015

  19. 19

    在将代码部署到的同一服务器上设置git存储库

  20. 20

    远程服务器上的C#数据库连接错误

  21. 21

    从客户端在服务器上创建新存储库时,SVN颠覆错误

  22. 22

    Laravel 5.4 上的多个数据库 SQL 服务器连接错误

  23. 23

    Windows 2012上的CreateMutex,错误代码为ERROR_ACCESS_DENIED

  24. 24

    在解析服务器应用程序上使用Node.js编写服务器端代码

  25. 25

    以下代码返回什么?mssql服务器2012

  26. 26

    在服务器上执行Java代码

  27. 27

    仅在服务器上执行代码

  28. 28

    仅在服务器上执行代码

  29. 29

    使用WAMP服务器的内部服务器错误

热门标签

归档