【问题标题】:Can I enable FIPS momentarily in a .net application?我可以在 .net 应用程序中暂时启用 FIPS 吗?
【发布时间】:2016-06-08 17:46:20
【问题描述】:

Openssl 允许进入和退出 FIPS 模式。 windows crypto api 和 .net wrapper 类是否有类似的功能?

我想启用 FIPS 模式,签署文档,然后返回正常模式。

【问题讨论】:

标签: c# .net cryptoapi fips


【解决方案1】:

很遗憾没有;至少,并非没有一些架构更改。

您可以通过设置注册表值来启用/禁用 FIPS 模式:

HKLM\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled (DWORD)

0 禁用,1 启用

但是,存在一些限制:一旦您将加密提供程序加载到您的进程中,它就会在该进程的剩余生命周期内“记住”该 FIPS 模式的状态。所以这样的代码可以工作:

(注意:两种情况都假设一开始 FIPS 模式是关闭的)

static void Main(string[] args)
{
    using (RegistryKey fipsAlgorithmPolicy = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy", true))
    {
        fipsAlgorithmPolicy.SetValue("Enabled", 1, RegistryValueKind.DWord);
    }
    SHA1 sha = new SHA1Managed(); // throws, which is what you want
}

但这样的代码不会:

static void Main(string[] args)
{
    SHA1 sha = new SHA1Managed(); // Does not throw, which is expected
    using (RegistryKey fipsAlgorithmPolicy = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy", true))
    {
        fipsAlgorithmPolicy.SetValue("Enabled", 1, RegistryValueKind.DWord);
    }
    sha = new SHA1Managed(); // Also does not throw, which is a shame
}

为了让您的代码反映新状态,您必须重新启动您的流程。话虽如此,您可以做的是将执行加密例程的代码隔离到设置 FIPS 模式后您的应用程序生成的“辅助”进程中。实现起来有点麻烦,但它允许您切换 FIPS 模式并让您的代码按预期运行。

【讨论】:

  • 感谢您的出色回答。最终改用 OpenSSL 和 openssl-net。
【解决方案2】:

您可以基于每个程序 - 在 .NET 运行时设置架构中将 enforceFIPSPolicy 设置为 true 将指定您要强制执行加密算法必须符合联邦信息处理标准 (FIPS) 的计算机配置要求)。

【讨论】:

  • 该文档似乎表明默认情况下设置为true,并且仅在已启用注册表项的情况下执行仅 FIPS 模式;它不是该注册表项的每个应用程序版本。它的真正目的似乎是您可以将其设置为false,并且“强制”仅 FIPS 模式的注册表项设置将被 CLR 忽略,从而允许该应用程序使用非 FIPS 认证的加密提供程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多