【问题标题】:How to make the following code FIPS compliant?如何使以下代码符合 FIPS 标准?
【发布时间】:2015-03-04 17:10:05
【问题描述】:

我有一个不符合 FIPS 的旧版应用程序。当用户第一次保存密码时,加密密码保存在数据库中,并使用以下算法确定登录时的加密密码(然后与数据库值进行比较)。

我的问题是我可以用符合 FIPS 的调用替换这些调用吗? (我尝试将哈希调用更改为 var hashmd5 = MACTripleDES.Create() 但 TripleDESCryptoServiceProvider 调用失败并显示“指定的密钥不是此算法的有效大小。”)。

      using (var hashmd5 = new MD5CryptoServiceProvider())
      {
          byte[] pwdhash = hashmd5.ComputeHash(Encoding.ASCII.GetBytes(PasswordSalt));
          using (var des = new TripleDESCryptoServiceProvider {Key = pwdhash, Mode = CipherMode.ECB})
          {
             byte[] buff = Encoding.UTF8.GetBytes(password);
                           result = Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buff, 0, buff.Length)); 

          }
      }

如果我真的做到了,我是否必须删除所有密码并要求用户重新创建他们的密码?

谢谢

【问题讨论】:

  • 您为什么不利用 Active Directory 来授权用户和凭据?如果你不得不问这个问题,你做对的概率接近于零。
  • 检查 hashmd5.HashSize 属性。来自 MSDN:“此算法支持从 128 位到 192 位的密钥长度,以 64 位为增量。”.
  • @PieterGeerkens :除了这个遗留实现之外,还有一个活动目录实现。如果我们更改上述代码,我正在尝试评估需要什么。

标签: c# encryption fips


【解决方案1】:

没有符合 FIPS 140-2 的 .Net 框架实现 MD5 哈希算法。您必须使用 SHA1 (System.Security.Cryptography.SHA1CryptoServiceProvider ) 或 SHA256 (System.Security.Cryptography.SHA256CryptoServiceProvider)。

是的,您需要重新散列密码才能使用。

【讨论】:

  • 谢谢凯文。然而,上面的代码有一个加密部分(TripleDESCryptoServiceProvider),我很难开始工作。
  • 首先,如果您要从密码中派生密钥,您可能应该使用 Rfc2898DeriveBytes 类而不是哈希算法。它就是为此而设计的,它允许您指定它返回的字节数。 TripleDESCryptoServiceProvider 的合法密钥大小为 64 位(8 字节)。 Sha1 生成 160 位(20 字节)的摘要,Sha256 生成 256 位(32 字节)的摘要。因此,您只需将哈希输出的前 8 个字节用作您的密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多