[問題記錄.dotnet]解決“此實現不是 Windows 平臺 FIPS 驗證的加密算法的一部分”

現象:

在個別機器上,下列代碼會導致異常:

代碼
new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(bytes, offset, count);

異常

System.InvalidOperationException: 此實現不是 Windows 平臺 FIPS 驗證的加密算法的一部分。
   在 System.Security.Cryptography.MD5CryptoServiceProvider..ctor()

   ......



根據錯誤信息在網上搜索了下,看到很多人都是說修改註冊表解決,但是原因卻不清楚
註冊表修改“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy\Enabled”
值爲0就可以解決。


進一步查找相關資料,得知是與聯邦信息處理標準 (FIPS,全稱是Federal Information Processing Standard)相關。如果機器啓用了FIPS策略(前面提到那個註冊表項Enabled爲1),那麼此時調用MD5CryptoServiceProvider就會拋出Invalid Operation Exception異常。
MSDN中有相關說明:

從.NET Framework 2.0開始,實現加密算法類的創建被受控於計算機的配置。 如果計算機配置爲算法需要符合 FIPS,並且類實現了一個與 FIPS 不兼容的算法,則任何創建該類的實例的嘗試將引發異常。 構造函數引發 InvalidOperationException 異常,Create 方法引發TargetInvocationException 異常和內部 InvalidOperationException 異常。

如果應用程序運行在其配置需要符合 FIPS 的計算機上,並且應用程序使用與 FIPS 不兼容的算法,則您可使用配置文件中的元素防止公共語言運行時 (CLR) 強制實施 FIPS 兼容性。 此元素在 .NET Framework 2.0 版 Service Pack 1 中引進。


所以,還可以通過設置應用程序配置文件中<enforceFIPSPolicy>元素值爲false解決:
<configuration>
    <runtime>
        <enforceFIPSPolicy enabled="false"/>
    </runtime>
</configuration>


參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章