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

[問題記錄.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 不相容的演算法,則任何建立該類的例項的嘗試將引發異常。 

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


所以,還可以通過設定應用程式配置檔案中<enforceFIPSPolicy>元素值為false解決:
<configuration>
    <runtime>
        <enforceFIPSPolicy enabled="false"/>
    </runtime>
</configuration>

參考: