Насколько детерминированный.Net GUIDs?

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

существует несколько вещей как это, что я уже встретился:

  • Атрибуты, не бывшие способные быть универсально
  • Неспособность для X для получения из X.Y (вложенный класс в X)
  • поля общественности использования блоков Итератора в сгенерированных классах

В каждом из этих случаев, было бы возможно получить немного больше свободы, за счет дополнительной сложности в компиляторе. Команда сделала прагматический выбор, за который я хвалю их - у меня был бы немного более строгий язык с точным компилятором на 99,9% (да, существуют ошибки; я столкнулся один на ПОЭТОМУ просто на днях), чем более выразительный язык, который не мог скомпилировать правильно.

РЕДАКТИРОВАНИЕ: вот псевдодоказательство того, как это, почему это выполнимо.

Полагают что:

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

Теперь преобразуйте:

try
{
    Console.WriteLine("a");
    yield return 10;
    Console.WriteLine("b");
}
catch (Something e)
{
    Console.WriteLine("Catch block");
}
Console.WriteLine("Post");

в (вид псевдокода):

case just_before_try_state:
    try
    {
        Console.WriteLine("a");
    }
    catch (Something e)
    {
        CatchBlock();
        goto case post;
    }
    __current = 10;
    return true;

case just_after_yield_return:
    try
    {
        Console.WriteLine("b");
    }
    catch (Something e)
    {
        CatchBlock();
    }
    goto case post;

case post;
    Console.WriteLine("Post");


void CatchBlock()
{
    Console.WriteLine("Catch block");
}

единственное дублирование находится в установке блоков попытки/выгоды - но это - что-то, что компилятор может, конечно, сделать.

я, возможно, пропустил что-то здесь - если так, сообщите мне!

13
задан Community 23 May 2017 в 11:45
поделиться

6 ответов

Это не полный ответ, но Я могу вам сказать, что 13-я шестнадцатеричная цифра всегда равна 4, потому что она обозначает версию алгоритма, используемого для генерации GUID (id est, v4); также, и я цитирую Википедию:

Криптоанализ GUID WinAPI генератор показывает, что, поскольку последовательность GUID V4 псевдослучайна, учитывая начальное состояние, можно прогнозировать до следующих 250 000 GUID возвращаемый функцией UuidCreate. Вот почему не следует использовать GUID. в криптографии, например, как случайные ключи.

Остальная часть статьи и ссылки на нее: http://en.wikipedia.org/wiki/Guid

--Edit--

From с точки зрения безопасности, я бы посоветовал вам сгенерировать свой идентификатор сеанса так, как вам хочется, а затем криптографически подписать его; таким образом вы можете упаковать любую информацию, которую хотите, а затем просто поставить подпись на конце - возможная проблема заключается в компромиссе между размером / силой вашего ключа и результирующим размером файла cookie. GUID полезны как идентификаторы, но я бы полагался только на специальный криптографический метод для обеспечения безопасности.

10
ответ дан 2 December 2019 в 00:03
поделиться

Я предлагаю вам использовать System.Security.Cryptography.RandomNumberGenerator . Это предназначено для получения чисел, которые нельзя реконструировать. Мотивация Гида - быть уникальным. Вы можете комбинировать как GUID, так и безопасное случайное число, но 128-битное безопасное случайное число никогда не будет конфликтовать на практике.

7
ответ дан 2 December 2019 в 00:03
поделиться

] Некоторые примечания:

  1. Я сомневаюсь, что любая реализация GUID была разработана для криптографической безопасности. (И это предположение подтверждается статьей, на которую ссылается следующий элемент.)
  2. 13-й символ ASCII указывает , какой алгоритм был использован для генерации GUID .

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

1
ответ дан 2 December 2019 в 00:03
поделиться

Что вы пытаетесь сделать? Хотите только источник случайных чисел?

Посмотрите random.org и hotbits . Много-много лет назад у меня была библиотека Java, которая собирала числа из этих источников и объединяла их вместе, чтобы получить довольно красивый случайный ряд (хотя предполагается, что эти два сайта не находятся в сговоре).

0
ответ дан 2 December 2019 в 00:03
поделиться

Короткий ответ: ни один guid не является достаточно сильным, чтобы сгенерировать идентификаторы сеанса, если вы хотите предотвратить угадывание и взлом идентификатора сеанса.

По той же причине, почему вы этого не хотите. Чтобы использовать GUID в качестве ключа AES, вы не хотите использовать их для каких-либо типов конфиденциальных идентификаторов.

GUID отлично подходит для того, для чего они предназначены: математически гарантированный уникальный идентификатор, который никогда не повторяется.

1218] Даже если взлом идентификатора сеанса стоит всего 1000 долларов, представьте, если это будет сделано 100 раз. Теперь вы говорите серьезно.

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

-1
ответ дан 2 December 2019 в 00:03
поделиться

Получить дубликат гида практически невозможно, учитывая возможность его получения. Вот несколько быстрых математических фактов

Песчинки в мире 75,000,000,000,000,000,000

Количество GUID 340,282,366,920,938,463,463,374,607,431,770,000,000

-1
ответ дан 2 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

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