我们有一些客户希望在Windows FIPS Mode中运行我们的软件(使用DevForce)。默认情况下,DevForce完成的大多数加密操作似乎都符合FIPS,但我们在DevForce进行的某些哈希处理方面遇到了问题。具体来说,使用调用到AesCryptoProvider.CalcStringHash
的代码,如下所示:
/// <summary>
/// Returns a hash encoded as a string with the chars (A-Z,A-z,0-9,_) only.
/// </summary>
/// <remarks>
/// Under the covers this method returns an 128 bit hash code calculated
/// using SHA1. This code is then encoded into an approx Base64 encode
/// of the chars listed above. This will usually be approx 28 chars in length,
/// which may then be truncated based on the maxChars parameter. This
/// method can process approx 100K 300 char strings a second.
/// </remarks>
/// <param name="stringToHash"></param>
/// <param name="maxChars"></param>
/// <returns></returns>
public string CalcStringHash(string stringToHash, int maxChars)
{
return CodingFns.EncodeBase64(new SHA1Managed().ComputeHash(Encoding.Unicode.GetBytes(stringToHash))).Substring(0, maxChars).Replace("=", "").Replace("/", "_d").Replace("+", "_p");
}
该方法直接实例化一个SHA1Managed
实例,不幸的是,该类不符合FIPS。
这是上下文的完整堆栈跟踪:
Exception: System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.
at System.Security.Cryptography.SHA1Managed..ctor()
at IdeaBlade.Core.PlatformServices.AesCryptoProvider.CalcStringHash(String stringToHash, Int32 maxChars)
at IdeaBlade.Core.DynamicTypeInfo.GetUniqueToken()
at IdeaBlade.Core.DynamicTypeInfo.BuildDynamicTypeName()
at IdeaBlade.Core.DynamicTypeInfo..ctor(TypeShape typeShape)
at IdeaBlade.Core.DynamicTypeInfo.FindOrCreate(IEnumerable`1 propertyNames, IEnumerable`1 propertyTypes)
at IdeaBlade.Linq.AnonymousProjectionSelector.GetDynamicTypeInfo()
at IdeaBlade.Linq.AnonymousProjectionSelector.ToLambdaExpression(Type delegateType)
at IdeaBlade.Linq.QueryableExtensions.Select[TSource](IQueryable`1 source, IProjectionSelector selector)
at My.Company.ServerClass.MyRemoteServerMethod(IPrincipal principal, EntityManager serverEm, Object[] rawArgs)
是否有解决办法使DevForce在FIPS模式下工作?还是可以在将来的版本中添加?
我注意到对该方法的评论谈到了性能。如果这是对性能至关重要的方法,而切换到FIPS投诉替代方法会导致性能下降,那么它可能是可配置的选项吗?我们只有一名客户抱怨FIPS,但还有更多客户在关注性能,所以我不想让那些不关心FIPS的人放慢脚步。
答案 0 :(得分:0)
这是一个错误,我们可以修复此问题(希望在下一版本中得到修复)。仅当为“动态”类型生成名称时才使用此哈希逻辑,该名称在处理匿名类型和动态查询时使用。您可以通过将其投影为自定义类型而不是匿名类型来解决此错误,否则,没有避免该问题的解决方法。
如果性能是一个问题,并且可能不是因为该哈希现在仅用于动态类型名称,那么我们可以考虑进行选择以在FIPS /非FIPS兼容提供程序之间进行选择。