Исключение при использовании DevForce в FIPS-совместимой среде

У нас есть клиенты, которые хотят запускать наше программное обеспечение (которое использует 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.

1 ответ

Это ошибка, и мы можем это исправить (надеюсь, в следующем выпуске). Эта логика хеширования используется только при генерации имени для "динамического" типа, который используется при работе с анонимными типами, а также с динамическими запросами. Вы могли бы обойти эту ошибку, проецируя в пользовательский тип, а не анонимный тип, в противном случае нет обходного пути, чтобы избежать проблемы.

Если производительность является проблемой, и, вероятно, это не так, поскольку это хеширование используется только для динамических имен типов, мы можем рассмотреть возможность выбора между FIPS/ не-FIPS-совместимыми поставщиками.

Другие вопросы по тегам