Как выбрать режим шифрования AES (CBC ECB CTR OCB CFB)?

Necromancing. Если используется поставщик LINQ, основанный на базе данных, может быть записано значительно более читаемое левое внешнее соединение:

from maintable in Repo.T_Whatever 
from xxx in Repo.T_ANY_TABLE.Where(join condition).DefaultIfEmpty()

Если вы опустите DefaultIfEmpty(), у вас будет внутреннее соединение.

Возьмите принятый ответ:

  from c in categories
    join p in products on c equals p.Category into ps
    from p in ps.DefaultIfEmpty()

Этот синтаксис очень сбивает с толку, и неясно, как это работает, когда вы хотите уйти, чтобы присоединиться к таблицам MULTIPLE.

Примечание. Следует отметить, что from alias in Repo.whatever.Where(condition).DefaultIfEmpty() является таким же, как внешний-apply / left-join-lateral, который любой (не отсталый) оптимизатор базы данных отлично способен перевести в левое соединение , до тех пор, пока вы не вводите значения строк (например, фактическое внешнее применение). Не делайте этого в Linq-2-Objects (потому что при использовании Linq-to-Objects нет DB-оптимизатора).

Подробный пример

var query2 = (
    from users in Repo.T_User
    from mappings in Repo.T_User_Group
         .Where(mapping => mapping.USRGRP_USR == users.USR_ID)
         .DefaultIfEmpty() // <== makes join left join
    from groups in Repo.T_Group
         .Where(gruppe => gruppe.GRP_ID == mappings.USRGRP_GRP)
         .DefaultIfEmpty() // <== makes join left join

    // where users.USR_Name.Contains(keyword)
    // || mappings.USRGRP_USR.Equals(666)  
    // || mappings.USRGRP_USR == 666 
    // || groups.Name.Contains(keyword)

    select new
    {
         UserId = users.USR_ID
        ,UserName = users.USR_User
        ,UserGroupId = groups.ID
        ,GroupName = groups.Name
    }

);


var xy = (query2).ToList();

При использовании с LINQ 2 SQL он хорошо переведёт на следующий очень читаемый SQL-запрос:

SELECT 
     users.USR_ID AS UserId 
    ,users.USR_User AS UserName 
    ,groups.ID AS UserGroupId 
    ,groups.Name AS GroupName 
FROM T_User AS users

LEFT JOIN T_User_Group AS mappings
   ON mappings.USRGRP_USR = users.USR_ID

LEFT JOIN T_Group AS groups
    ON groups.GRP_ID == mappings.USRGRP_GRP

Редактировать:

См. Также & quot; Конвертировать запрос SQL Server в запрос Linq & quot; для более сложного примера.

Кроме того, если вы делаете это в Linq-2-Objects (вместо Linq-2-SQL), вы должны сделать это старомодно (потому что LINQ to SQL правильно это переводит для присоединения операции, но над объектами этот метод заставляет полностью сканировать и не использует поиск по индексу, почему ...):

    var query2 = (
    from users in Repo.T_Benutzer
    join mappings in Repo.T_Benutzer_Benutzergruppen on mappings.BEBG_BE equals users.BE_ID into tmpMapp
    join groups in Repo.T_Benutzergruppen on groups.ID equals mappings.BEBG_BG into tmpGroups
    from mappings in tmpMapp.DefaultIfEmpty()
    from groups in tmpGroups.DefaultIfEmpty()
    select new
    {
         UserId = users.BE_ID
        ,UserName = users.BE_User
        ,UserGroupId = mappings.BEBG_BG
        ,GroupName = groups.Name
    }

);

433
задан Cheeso 3 August 2009 в 05:12
поделиться

4 ответа

  • ECB не следует использовать при шифровании более одного блока данных одним и тем же ключом.

  • CBC, OFB и CFB похожи, однако OFB / CFB лучше, потому что вам нужно только шифрование а не дешифрование, которое может сэкономить место для кода.

  • CTR используется, если вы хотите хорошее распараллеливание (т.е. скорость), вместо CBC / OFB / CFB.

  • Режим XTS является наиболее распространенным, если вы кодируете случайное доступные данные (например, жесткий диск или RAM).

  • OCB - безусловно лучший режим, поскольку он позволяет шифрование и аутентификацию за один проход. Однако в США на него есть патенты.

Единственное, что вам действительно нужно знать, это то, что ECB нельзя использовать, если вы не шифруете только 1 блок. XTS следует использовать, если вы шифруете данные с произвольным доступом, а не поток.

  • Вы должны ВСЕГДА использовать уникальные IV при каждом шифровании, и они должны быть случайными . Если вы не можете гарантировать, что они случайные , используйте OCB, поскольку для этого требуется только одноразовый номер , а не IV , и между ними есть явная разница. Одноразовый номер не снижает безопасность, если люди могут угадать следующий, IV может вызвать эту проблему.
298
ответ дан 22 November 2019 в 23:09
поделиться
  1. Все, что угодно, только не ECB.
  2. При использовании CTR обязательно, чтобы вы использовали разные IV для каждого сообщения, иначе злоумышленник сможет взять два шифрованных текста и получить комбинированный незашифрованный открытый текст. Причина в том, что режим CTR по существу превращает блочный шифр в потоковый шифр, а первое правило потоковых шифров - никогда не использовать один и тот же ключ + IV дважды.
  3. На самом деле нет большой разницы в том, насколько сложны режимы реализовать. Некоторые режимы требуют, чтобы блочный шифр работал только в направлении шифрования. Однако большинство блочных шифров, включая AES, не требуют гораздо большего количества кода для реализации дешифрования.
  4. Для всех режимов шифрования важно использовать разные IV для каждого сообщения, если ваши сообщения могут быть идентичными в первых нескольких байтах, а ты не Я не хочу, чтобы злоумышленник знал об этом.
28
ответ дан 22 November 2019 в 23:09
поделиться

Вы начали с чтения информации об этом в Википедии - Режимы работы блочного шифра ? Затем перейдите по ссылке в Википедии на NIST: Рекомендации по режимам работы блочного шифра .

12
ответ дан 22 November 2019 в 23:09
поделиться

Я знаю один аспект: Хотя CBC обеспечивает лучшую безопасность, изменяя IV для каждого блока, он не применим к зашифрованному контенту, к которому осуществляется произвольный доступ (например, к зашифрованному жесткому диску).

Таким образом, используйте CBC (и другие последовательные режимы) для последовательных потоков и ECB для случайных доступ.

-4
ответ дан 22 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: