Исключение при использовании 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.


person Stephen McDaniel    schedule 19.06.2018    source источник


Ответы (1)


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

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

person Kim Johnson    schedule 21.06.2018
comment
Спасибо! Мы можем дождаться следующего релиза, так как обходной путь кажется сложным (мы делаем тонну динамических запросов и выбираем анонимные типы, так что трогать весь этот код будет неинтересно). Производительность, вероятно, не является проблемой, если это произойдет только один раз за выполнение запроса или что-то в этом роде. Я просто волновался, не используется ли он где-нибудь еще в узком цикле или что-то в этом роде. И я думаю, что я должен был упомянуть об этом изначально, но можете ли вы также проверить, что в DevForce нет другого кода, не относящегося к FIP? Я бы не хотел, чтобы пройти мимо этой ошибки только для того, чтобы ударить другой. - person Stephen McDaniel; 21.06.2018
comment
Стивен, мы выпустили версию 7.5.2, которая включает это исправление. - person Kim Johnson; 09.07.2018