当前位置: 首页 > 编程语言 > C#

在Server2012上使用MSCryptographicLibrary–CryptCreateHash错误代码87:ERROR_INVALID_PARAMETERShare

时间:2023-04-10 12:43:11 C#

应用程序,但我收到未经确认的错误。这段代码已经在我们的代码库中存在多年,并且在任何其他平台上都没有遇到任何问题。有问题的代码调用了advapi32.dll(微软加密库)的CryptCreateHash函数。调用函数时,我返回0表示调用失败,然后Err.LastDllError返回错误码87,也就是ERROR_INVALID_PARAMETER。正如我之前所说,这段代码已经在各种环境中运行了多年——包括开发人员使用的WindowsServer2012测试机。但是当放置在同时运行Server2012的实时环境中时(尽管在负载平衡系统的稍微复杂的上下文中),我得到了错误。两台服务器都没有更新到WindowsServer2012R2,它运行的是开箱即??用的操作系统版本。使用CryptAcquireContext(hCryptProv,vbNullString,SERVICE_PROVIDER,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)创建CryptProvider句柄后,我使用hCryptProv调用CryptCreateHas函数。如果CryptCreateHash(hCryptProv,CALG_MD5,0,0,hHash)=0ThenDim_errorAsInteger=Err.LastDllErrorThrowNewCryptoException("ErrorduringCryptCreateHash.ErrorCode:"&_error.ToString)End如果从实时和开发环境传递给方法的一些数据示例:Development:hCryptProv=4966968CALG_MD5=32771hHash=0Live:hCryptProv=1587622576CALG_MD5=32771hHash=0看来这两组参数基本一致,虽然服务器端的hCryptProv趋向于是一个更大的数字(可能是因为它有更多的内存?)。我尝试使用SHA1而不是MD5,但出现了同样的错误。假设advapi32.dll是32位,这可能是一个32/64位相关问题?任何建议将不胜感激,谢谢。编辑:请求的原型:私有声明函数CryptAcquireContextLib“advapi32.dll”别名“CryptAcquireContextA”_(ByRefphProvAsIntPtr,_ByValpszContainerAsString,_ByValpszProviderAsString,_ByValdwProvTypeAsInteger,_BylagsValdwInteger)AsIntegerPrivateDeclareFunctionCryptCreateHashLib"advapi32.dll"_(ByValhProvAsIntPtr,_ByValAlgidAsInteger,_ByValhKeyAsInteger,_ByValdwFlagsAsInteger,_ByRefphHashAsInteger)作为整数I一直在使用phProv的数据类型,phProv是Integer,我还没有用IntPtr测试过。我尝试使用ULong,因为这就是MSDN文档中定义HCRYPTPROV数据类型的方式。typedefULONG_PTRHCRYPTPROV;这里这里还还cryptAcquireContext在在在各配置中返回的的句柄:live32:hcryptprov=606412672live64:hcryptprov=-1480179632本地:我使用Integer作为数据类型,注意现场溢出。编辑2这可能是固定的。现在,当我调用CryptDecrypt时,出现错误-2146893820(NTE_BAD_LEN)。可能与*pdwDataLen变量有关。下面是方法定义:PrivateDeclareFunctionCryptDecryptLib"advapi32.dll"_(ByValhKeyAsIntPtr,_ByValhHashAsIntPtr,_ByValFinalAsBoolean,_ByValdwFlagsAsInteger,_ByValpbDataAsString,_ByRefpdwDataLenAsInteger)_AsBooleanEndFunctionCall:lLength=Len(strData)IfCryptDecrypt(_hKey,0,1,0,sTemp,lLength)=FalseThenDim_errorAsInteger=Err.LastDllErrorThrowNewCryptoException("CryptDecrypt期间出错.ErrorCode:"&_error.ToString)EndIf如果你有ULONG_PTR类型,你需要在.NET中将ULONG_PTR定义为IntPtr。您还需要一个DllImportAttribute您的CryptCreateHash应该是:声明自动函数CryptCreateHashLib“advapi32.dll”_(ByValhProv作为IntPtr,_ByValalgId作为整数,_ByValhKey作为IntPtr,_ByValdwFlags作为整数,_ByRefphHastIntPtr)AsBoolean另外,一定要告诉它设置之前的错误。在C#中,我们使用DllImportAttribute并确保SetLastError=true。否则,调用Marshal.GetLastWin32Error不会返回预期的结果。更新你的CryptDecrypt原型应该是:DeclareFunctionCryptDecryptLib"advapi32.dll"(ByValhkeyAsIntPtr,_ByValhHashAsIntPtr,_ByValfinalAsBoolean,_ByValflagsAsInteger,_ByValdataAsByte(),ByRefdataLenAsInteger)AsBoolean您需要将字符串转换为字节数组。另请注意,dataLen参数是字节缓冲区的长度,而不是字符串的长度。您应该看看pinvoke.net,它托管了大多数WindowsAPI调用的原型和示例。以上就是C#学习教程:UsingMSEncryptionLibraryonServer2012–CryptCreateHashErrorCode87:ERROR_INVALID_PARAMETER分享的所有内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: