У нас есть клиенты, которые хотят запускать наше программное обеспечение (использующее DevForce) с Windows в "Режим FIPS". Похоже, что большая часть шифрования, выполняемого 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.