В этой статье есть несколько проблем. Помогите улучшить ее или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти сообщения )
|
Noise Protocol Framework , иногда называемый Noise или Noise Framework , позволяет проектировать протоколы защищенных каналов между двумя сторонами. По сравнению с TLS 1.3 , Noise Framework (описанный в общедоступной спецификации [1] ) позволяет выбирать шаблон рукопожатия и криптографические алгоритмы для создания конкретного протокола, имеющего наиболее подходящие криптографические свойства и компромиссы для поставленной задачи, например, поведение RTT. Noise является основой некоторых протоколов со значительным развертыванием, таких как Nebula Slack, [2] WhatsApp и WireGuard .
Протокол безопасного канала состоит из двух фаз:
Шаблон рукопожатия можно описать на схеме как набор сообщений, каждое из которых снабжено списком токенов, описывающих криптографические операции, выполняемые в состоянии рукопожатия стороны.
Пример шаблона рукопожатия, содержащего 3 сообщения:
IK
<- s
...
-> e , es , s , ss
<- e , ee , se
Названия рукопожатий шаблонны:
I
= Статический ключ для инициатора немедленно передается ответчику, несмотря на сниженное или отсутствующее сокрытие личностиK
= Статический ключ для инициатора K , известный ответчику Строка(и) перед ...
представляют собой сообщение, предшествующее DH AKE, например, внеполосную передачу открытого ключа.
В спецификации перечислены три шаблона одностороннего рукопожатия и 12 основных интерактивных шаблонов рукопожатия. Существуют вариации некоторых из них:
1
используется после первого и/или второго символа, например NK1
илиX1X1
Npsk0
илиXpsk1
fallback
модификатор. Шумовая труба — пример, найденный в §10.4 [3]Реальный пример — WireGuard, конструкция которого описана на странице 10 Белой книги Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s
.
Каждый шаблон рукопожатия может быть объединен с одной из 16 комбинаций 8 криптографических алгоритмов, перечисленных в Спецификации. Поскольку эти алгоритмы имеют сопоставимое качество и не увеличивают пространство проектирования.
Спецификация описывает API в §5 [4] с использованием следующих объектов, каждый из которых имеет небольшой набор методов :
CipherState
содержит k и n переменных, которые он использует для шифрования и дешифрования шифротекстов. Во время фазы рукопожатия каждая сторона имеет один CipherState
, но во время фазы транспортировки каждая сторона имеет два CipherState
объекта: один для отправки и один для получения.SymmetricState
содержит переменные CipherState
ck и h . Он так назван, потому что инкапсулирует все «симметричное крипто», используемое Noise. Во время фазы рукопожатия у каждой стороны есть один , который может быть удален после завершения рукопожатия.SymmetricState
HandshakeState
содержит SymmetricState
плюс переменные DH ( s , e , rs , re ) и переменную, представляющую шаблон рукопожатия. Во время фазы рукопожатия каждая сторона имеет один HandshakeState
, который может быть удален после завершения рукопожатия.Реализация конкретного протокола включает в себя проектирование представления сообщений, а также аспекты за пределами Noise Framework. Пример последнего происходит с протоколами, использующими транспорты UDP , такими как WireGuard , который использует скользящее окно для обработки прибытия вне очереди.
Свойства безопасности нескольких шаблонов рукопожатия описаны в Спецификации и могут поддерживать взаимную аутентификацию, прямую секретность, нулевое круговое шифрование, сокрытие личности и другие расширенные функции. Формальный криптографический анализ общих шаблонов рукопожатия появился в академической литературе. [5] [6] Вторая попытка привела к созданию онлайн-инструмента Noise Explorer. [7]
Большая часть нижеследующего текста представляет собой выдержки из Спецификации с форматированием:
IK
для имен протоколов, состоящих из шаблонов рукопожатия, криптографии и модификаторовс акцентом на:
Фреймворк был разработан Тревором Перрином при поддержке Мокси Марлинспайка на основе работы, проделанной в Open Whisper Systems .
« Шум » относится к одному из обоснований дизайна: [8]
Шифрованные тексты должны быть неотличимы от случайных, потому что:
Это упрощает использование протоколов Noise со случайным заполнением (для сокрытия длины) или для устойчивых к цензуре "неотпечатываемых" протоколов или со стеганографией . Однако следует отметить, что эфемерные ключи, скорее всего, будут отличимы от случайных, если не используется такая техника, как Elligator. [9]
Возможно, это также игра слов на слово Signal (программное обеспечение) .
Большинство протоколов защищенных каналов используют AKE на основе подписей (для аутентификации) и Diffie-Hellman (для обмена ключами). В последние 10–15 лет растет интерес к AKE на основе DH (без подписей).
Элегантный, но каждый протокол начинается с нуля
Первоначальный коммит для спецификации был сделан 4 августа 2014 года [16] и претерпел множество изменений после обсуждения в списке рассылки до rev34 11 июля 2018 года. [17] Примечание: первоначально поддерживался в Wiki, начиная с 10 февраля 2013 года. [18]
Чтобы создать имя Noise Protocol, Initialize()
вам нужно объединить строку ASCII Noise_
с четырьмя секциями имен, разделенными подчеркиванием, которые последовательно называют шаблон рукопожатия, функции DH, функции шифрования и затем хэш-функции. Результирующее имя должно быть 255 байт или меньше. [19] Примеры:
Noise_XX_25519_AESGCM_SHA256
Noise_N_25519_ChaChaPoly_BLAKE2s
Noise_IK_448_ChaChaPoly_BLAKE2b
Каждый раздел имени должен состоять только из буквенно-цифровых символов (т. е. символов из одного из диапазонов «A»...«Z», «a»...«z» и «0»...«9»), а также двух специальных символов «+» и «/».
К каждому разделу имени применяются дополнительные правила, как указано ниже.
Раздел имени шаблона рукопожатия содержит имя шаблона рукопожатия и последовательность из нуля или более модификаторов шаблона. [20]
Имя шаблона рукопожатия должно быть заглавной строкой ASCII, содержащей только буквенные символы или цифры (например, XX1
или IK
).
Модификаторы шаблонов определяют произвольные расширения или модификации поведения, заданного шаблоном рукопожатия. Например, модификатор может быть применен к шаблону рукопожатия, который преобразует его в другой шаблон в соответствии с некоторым правилом. Модификаторы psk0
и fallback
являются примерами этого и будут определены далее в этом документе.
Модификатор шаблона именуется строчной буквенно-цифровой строкой ASCII, которая должна начинаться с буквенного символа (не цифры). Модификатор шаблона добавляется к базовому шаблону, как описано ниже:
Первый модификатор, добавленный к базовому шаблону, просто добавляется. Таким образом, fallback
модификатор, добавленный к XX
шаблону, производит XXfallback
. Дополнительные модификаторы разделяются знаком плюс. Таким образом, добавление psk0
модификатора приведет к разделу имени XXfallback+psk0
или полному имени протокола, например Noise_XXfallback+psk0_25519_AESGCM_SHA256
.
В некоторых случаях последовательный порядок модификаторов будет указывать на разные протоколы. Однако, если порядок некоторых модификаторов не имеет значения, то их требуется сортировать в алфавитном порядке (это произвольное соглашение для обеспечения совместимости).
Правила для разделов DH, шифра и имени хеша идентичны. Каждый раздел имени должен содержать одно или несколько имен алгоритмов, разделенных знаками плюс. [21]
Каждое имя алгоритма должно состоять исключительно из буквенно-цифровых символов и символа косой черты ("/"). Рекомендуется, чтобы имена алгоритмов были короткими, а символ "/" использовать только при необходимости, чтобы избежать двусмысленности (например, SHA3/256
предпочтительнее, чем SHA3256
).
В большинстве случаев в каждом разделе имени будет одно имя алгоритма (т.е. без знаков плюс). Несколько имен алгоритмов используются только тогда, когда это требуется шаблоном или модификатором.
Ни один из шаблонов или модификаторов в этом документе не требует нескольких имен алгоритмов в любом разделе имен. Однако эта функциональность может быть полезна в будущих расширениях. Например, несколько имен алгоритмов могут использоваться в разделе DH для указания "гибридной" постквантовой прямой секретности; или несколько алгоритмов хэширования могут быть указаны для разных целей.
В Спецификации перечислены 8 современных алгоритмов со следующими названиями. [22] [23]
Функции Диффи-Хеллмана | |
---|---|
25519 | Кривая25519 |
448 | Кривая448 |
Функции шифрования | |
ChaChaPoly | ЧаЧа20 - Поли1305 |
AESGCM | Расширенный стандарт шифрования (AES) в режиме Галуа/счетчика (GCM) |
Хэш-функции | |
SHA256 | SHA256 |
SHA512 | SHA512 |
BLAKE2s | BLAKE2s |
BLAKE2b | БЛЕЙК2б |
В Wiki есть этот список неофициальных алгоритмов; [24] Я опустил постквантовые алгоритмы, поскольку записи появились до начала работы NIST по стандартизации постквантовой криптографии, начатой в 2016 году с первыми тремя постквантовыми криптостандартами: FIPS 203, FIP 204 и FIP 205 в 2024 году.
Здесь мы [ кто? ] документируем некоторые названия, которые могут быть использованы для нестандартных алгоритмов, чтобы экспериментальное использование этих алгоритмов могло использовать согласованные названия (ПРИМЕЧАНИЕ: ни один из этих алгоритмов не одобрен для использования с Noise, используйте на свой страх и риск).
Функции Диффи-Хеллмана | |
---|---|
secp256k1 | secp256k1, [25] используется Lightning |
FourQ | ЧетыреК [26] |
NIST P256 | П-256 [27] |
NIST P384 | П-384 [28] |
NIST P521 | П-521 [29] |
Функции шифрования | |
DeoxysII | используется Найквистом |
AESGCMSIV | AES-GCM-SIV |
AESPMACSIV | AES-GCM-SIV |
Kravatte | Краватте [30] |
KravatteSIV | Краватте-SIV [31] |
Хэш-функции | |
SHA3/256 | SHA-3#Экземпляры |
SHA3/512 | SHA-3#Экземпляры |
SHAKE128 | SHA-3#Экземпляры (HASHLEN=32) |
SHAKE256 | SHA-3#Экземпляры (HASHLEN=64) |
K12 | Кенгуру12 [32] |
M14 | Марсупилами14 [33] |
Noise Protocols имеют входной пролог, который позволяет хешировать произвольные данные в переменную h. Если обе стороны не предоставят идентичные данные пролога, рукопожатие не будет выполнено из-за ошибки расшифровки. Это полезно, когда стороны участвуют в переговорах до рукопожатия и хотят убедиться, что они разделяют идентичные взгляды на эти переговоры. [34]
Например, предположим, что Боб сообщает Алисе список протоколов шума, которые он готов поддерживать. Затем Алиса выберет и выполнит один протокол. Чтобы гарантировать, что «человек посередине» не отредактирует список Боба, удалив опции, Алиса и Боб могут включить этот список в качестве данных пролога.
Обратите внимание, что хотя стороны подтверждают идентичность своих прологов, они не смешивают данные пролога с ключами шифрования. Если вход содержит секретные данные, предназначенные для усиления шифрования, вместо этого следует использовать рукопожатие PSK (см. §9).
Следующие шаблоны рукопожатий представляют собой «односторонние» рукопожатия, поддерживающие односторонний поток данных от отправителя к получателю. Эти шаблоны могут использоваться для шифрования файлов, записей базы данных или других неинтерактивных потоков данных. [35]
После одностороннего рукопожатия отправитель может отправить поток транспортных сообщений, зашифровав их с помощью первого CipherState, возвращаемого из . Split()
Второй CipherState из Split()
отбрасывается — получатель не должен отправлять никаких сообщений с его помощью (так как это нарушит правила в §7.3).
Односторонние шаблоны именуются одним символом, который указывает на статус статического ключа отправителя:
N
= Нет статического ключа для отправителяK
= Статический ключ для инициатора K , известный ответчикуX
= Статический ключ отправителя X передан получателюN
:
<- с ... -> е , ес
K
:
-> с <- с ... -> е , ес , сс
X
:
<- с ... -> е , ес , с , сс
N
является обычным шифрованием с открытым ключом на основе DH. Другие шаблоны добавляют аутентификацию отправителя, где открытый ключ отправителя либо известен получателю заранее ( K
), либо передается в зашифрованном виде ( X
).
Следующие шаблоны рукопожатия представляют интерактивные протоколы. Эти 12 шаблонов называются «фундаментальными» интерактивными шаблонами рукопожатия. [36]
Основные интерактивные шаблоны именуются двумя символами, которые указывают на статус статических ключей инициатора и ответчика:
Первый символ относится к статическому ключу инициатора:
N
= N
o статический ключ для инициатораK
= Статический ключ для инициатора, K
известный ответчикуX
= Статический ключ для инициатора X
передан («передан») ответчикуI
= Статический ключ для инициатора I
немедленно передается ответчику, несмотря на сниженное или отсутствующее сокрытие личностиВторой символ относится к статическому ключу ответчика:
N
= N
o статический ключ для ответчикаK
= Статический ключ для ответчика, K
известный инициаторуX
= Статический ключ для ответчика X
передан («передан») инициаторуNN | ||
---|---|---|
0 | 0 | #1 -> e |
0 | 1 | #2 <- e, ee |
0 | 1 | #3 -> |
NK | ||
#1 <- s | ||
... | ||
0 | 2 | #2 -> e, es |
2 | 1 | #3 <- e, ee |
0 | 5 | #4 -> |
NX | ||
0 | 0 | #1 -> e |
2 | 1 | #2 <- e, ee, s, es |
0 | 5 | #3 -> |
XN | ||
0 | 0 | #1 -> e |
0 | 1 | #2 <- e, ee |
2 | 1 | #3 -> s, se |
0 | 5 | #4 <- |
XK | ||
#1 <- s | ||
... | ||
0 | 2 | #2 -> e, es |
2 | 1 | #3 <- e, ee |
2 | 5 | #4 -> s, se |
2 | 5 | #5 <- |
XX | ||
0 | 0 | #1 -> e |
2 | 1 | #2 <- e, ee, s, es |
2 | 5 | #3 -> s, se |
2 | 5 | #4 <- |
KN | ||
#1 -> s | ||
... | ||
0 | 0 | #2 -> e |
0 | 3 | #3 <- e, ee, se |
2 | 1 | #4 -> |
0 | 5 | #5 <- |
KK | ||
#1 -> s | ||
#2 <- s | ||
... | ||
1 | 2 | #3 -> e, es, ss |
2 | 4 | #4 <- e, ee, se |
2 | 5 | #5 -> |
2 | 5 | #6 <- |
KX | ||
#1 -> s | ||
... | ||
0 | 0 | #2 -> e |
2 | 3 | #3 <- e, ee, se, s, es |
2 | 5 | #4 -> |
2 | 5 | #5 <- |
IN | ||
0 | 0 | #1 -> e, s |
0 | 3 | #2 <- e, ee, se |
2 | 1 | #3 -> |
0 | 5 | #4 <- |
IK | ||
#1 <- s | ||
... | ||
1 | 2 | #2 -> e, es, s, ss |
2 | 4 | #3 <- e, ee, se |
2 | 5 | #4 -> |
2 | 5 | #5 <- |
IX | ||
0 | 0 | #1 -> e, s |
2 | 3 | #2 <- e, ee, se, s, es |
2 | 5 | #3 -> |
2 | 5 | #4 <- |
Первые два столбца в таблице выше, перед каждым шаблоном сообщения, перечисляют свойства безопасности для рукопожатия Noise и транспортных полезных нагрузок для всех односторонних шаблонов в §7.4 и основных шаблонов в §7.5. Каждой полезной нагрузке назначается свойство «источник» относительно степени аутентификации отправителя, предоставленной получателю, и свойство «назначение» относительно степени конфиденциальности, предоставленной отправителю.
Для отправителя:
Используется: IN
#1, IN
#2, IN
#4, # IX
1, #2, #3, #5, #2, #2, #4, #1, #2, #3, #1 , #3 , #2, #1, #2, #4, #1KN
KN
KN
KX
NK
NK
NN
NN
NN
NX
NX
XK
XN
XN
XN
XX
Используется: IK
#2, IN
#3, KK
#3, KN
#4, NK
#3 NN
, NN
# NX
2, XK
#3, XN
#2, #3, #2, XN
#3, XX
#2
Используется: IK
#2, IK
#3, IK
#4, IK
#5, IN
#3 IX
, # IX
2 IX
, KK
#3, # 4 KK
, #3, #4 KK
, #5, KK
#6, KN
#4, #3 KX
, # 4 KX
, #5, #2, #3, #2, #3, #4, #5, # 3, #2 , #3, #4KX
NK
NK
NX
XK
XK
XK
XK
XN
XX
XX
XX
Для получателя:
Используется: IN
#1, IN
#2, IN
#4, # IX
1, #2, #3, #5, #2, #2, #4, #1, #2, #3, #1 , #3 , #2, #1, #2, #4, #1KN
KN
KN
KX
NK
NK
NN
NN
NN
NX
NX
XK
XN
XN
XN
XX
Используется: IK
#2, IN
#3, KK
#3, KN
#4, NK
#3 NN
, NN
# NX
2, XK
#3, XN
#2, #3, #2, XN
#3, XX
#2
Используется: IK
#2, IK
#3, IK
#4, IK
#5, IN
#3 IX
, # IX
2 IX
, KK
#3, # 4 KK
, #3, #4 KK
, #5, KK
#6, KN
#4, #3 KX
, # 4 KX
, #5, #2, #3, #2, #3, #4, #5, # 3, #2 , #3, #4KX
NK
NK
NX
XK
XK
XK
XK
XN
XX
XX
XX
Используется: IN
#2, IX
#2, KN
#3, KX
#3
Используется: IK
#3, KK
#4
Используется: IK
#4, IK
#5, IN
#4 , # IX
3, # 4 , # 5, #6 , # 5, #4 , #5 , #4, #3 , #4, #5, #4, #3, #4IX
KK
KK
KN
KX
KX
NK
NX
XK
XK
XN
XX
XX
В следующей таблице перечислены свойства сокрытия личности для всех шаблонов одностороннего рукопожатия в §7.4 и фундаментальных шаблонов рукопожатия в §7.5. Кроме того, мы перечислим несколько шаблонов отложенного рукопожатия, которые имеют другие свойства сокрытия личности, чем соответствующий фундаментальный шаблон. [37]
Каждому шаблону назначаются свойства, описывающие конфиденциальность, предоставленную статическому открытому ключу инициатора и статическому открытому ключу ответчика. Базовые предположения заключаются в том, что эфемерные закрытые ключи безопасны, и что стороны прерывают рукопожатие, если они получают статический открытый ключ от другой стороны, которой они не доверяют.
В этом разделе рассматривается только утечка личности через статические поля открытого ключа в рукопожатиях. Конечно, личности участников Noise могут быть раскрыты другими способами, включая поля полезной нагрузки, анализ трафика или метаданные, такие как IP-адреса.
Инициатор | Респондент | |
---|---|---|
N | - | 3 |
K | 5 | 5 |
X | 4 | 3 |
NN | - | - |
NK | - | 3 |
NK1 | - | 9 |
NX | - | 1 |
XN | 2 | - |
XK | 8 | 3 |
XK1 | 8 | 9 |
XX | 8 | 1 |
KN | 7 | - |
KK | 5 | 5 |
KX | 7 | 6 |
IN | 0 | - |
IK | 4 | 3 |
IK1 | 0 | 9 |
IX | 0 | 6 |
Свойства соответствующего открытого ключа:
Основные шаблоны рукопожатия, описанные в предыдущем разделе, выполняют операции DH для аутентификации ( es и se ) как можно раньше. [38]
Можно описать дополнительный набор шаблонов рукопожатия, которые откладывают эти DH аутентификации до следующего сообщения. Чтобы назвать эти шаблоны отложенного рукопожатия, цифра 1
используется после первого и/или второго символа в имени фундаментального шаблона, чтобы указать, что DH аутентификации инициатора и/или ответчика откладывается до следующего сообщения.
Отложенные шаблоны могут быть полезны по нескольким причинам:
Ниже приведены два примера, показывающие фундаментальный шаблон рукопожатия слева и отложенный вариант(ы) справа. Полный набор из 23 отложенных шаблонов рукопожатия находится в Приложении §18. [39]
NK | NK1 |
---|---|
<- с | <- с |
... | ... |
-> е , ес | -> е |
-> е , е | -> е , ее , ес |
XX | X1X |
-> е | -> е |
<- е , е , с , ес | <- е , е , с , ес |
-> с , се | -> с |
<- се | |
XX1 | |
-> е | |
<- е , е , с | |
-> ес , с , се | |
X1X1 | |
-> е | |
<- е , е , с | |
-> ес , с | |
<- се |
[40]
До сих пор мы предполагали, что Алиса и Боб хотят выполнить один Noise Protocol, выбранный инициатором (Алисой). Однако есть ряд причин, по которым Боб может захотеть переключиться на другой Noise Protocol после получения первого сообщения Алисы. Например: [41]
Алиса могла выбрать протокол Noise, основанный на шифре, функции DH или шаблоне рукопожатия, которые Боб не поддерживает.
Алиса могла отправить зашифрованное начальное сообщение с «нулевым RTT» на основе устаревшей версии статического открытого ключа Боба или PSK.
Обработка этих сценариев требует составного протокола, в котором Боб переключается с исходного протокола Noise, выбранного Алисой, на новый протокол Noise. В таком составном протоколе роли инициатора и ответчика поменялись бы местами — Боб стал бы инициатором нового протокола Noise, а Алиса — ответчиком.
Составные протоколы значительно усложняют работу, поскольку Алисе необходимо объявить протокол Noise, с которого она начинает, и протокол(ы) Noise, на которые она может переключиться, и обеим сторонам необходимо договориться о безопасном переходе.
Эти детали в значительной степени выходят за рамки этого документа. Однако, чтобы дать пример того, как могут быть построены составные протоколы, и предоставить некоторые строительные блоки, следующие разделы определяют модификатор отката и показывают, как его можно использовать для создания составного протокола Noise Pipe.
Noise Pipes поддерживают XX
шаблон, но также позволяют Алисе кэшировать статический открытый ключ Боба и попытаться выполнить IK
рукопожатие с шифрованием 0-RTT.
В случае, если Боб не сможет расшифровать первоначальное сообщение Алисы IK
, он переключится на XXfallback
шаблон, который по сути позволяет сторонам завершить XX
рукопожатие, как если бы Алиса отправила XX
первоначальное сообщение вместо IK
исходного сообщения.
fallback
§10.2Модификатор fallback
преобразует шаблон, инициированный Алисой, в шаблон, инициированный Бобом, преобразуя начальное сообщение Алисы в предварительное сообщение, которое Боб должен получить каким-то другим способом (например, через начальное IK
сообщение от Алисы). После этого преобразования остальная часть шаблона рукопожатия интерпретируется как шаблон рукопожатия, инициированный Бобом. [42]
Например, вот fallback
модификатор, применяемый для XX
создания XXfallback
:
XX
:
-> е <- е , ee , s , es -> s , se
XXfallback
:
-> е ... <- е , ее , с , ес -> с , се
Обратите внимание, что откат может быть применен только к шаблонам рукопожатия в форме, инициированной Алисой, где первое сообщение Алисы может быть интерпретировано как предварительное сообщение (т. е. оно должно быть либо e , s , либо « e , s »).
Типичный составной протокол для шифрования с нулевым RTT включает три различных протокола шума: [43]
Должен быть какой-то способ для Боба различать случаи полного и нулевого RTT при получении первого сообщения. Если Алиса делает попытку нулевого RTT, должен быть какой-то способ для нее различать случаи нулевого RTT и переключения при получении ответа.
Например, каждое сообщение о рукопожатии может предшествовать некоторым данным переговоров, таким как байт типа (см. §13). Эти данные не являются частью сообщения Noise, но сигнализируют, какой протокол Noise используется.
В этом разделе определяется протокол Noise Pipe. Следующие шаблоны рукопожатия удовлетворяют полным, нулевым RTT и ролям коммутатора, обсуждавшимся в предыдущем разделе, поэтому могут использоваться для предоставления полного рукопожатия с простой опцией нулевого RTT: [3]
XX
:
-> е <- е , ee , s , es -> s , se
IK
:
<- с ... -> е , эс , s , ss <- е , ee , se
XXfallback
:
-> е ... <- е , ее , с , ес -> с , се
Шаблон XX
используется для полного рукопожатия, если стороны ранее не общались, после чего Алиса может кэшировать статический открытый ключ Боба.
Шаблон IK
используется для установления связи с нулевым RTT.
Шаблон XXfallback
используется для установления связи, если Бобу не удается расшифровать исходное IK
сообщение (возможно, из-за смены статического ключа).
Электронное письмо от Тревора Перрина от 4 марта 2018 г. [44]
Я создал проект спецификации для фреймворка "NLS", который добавляет язык переговоров ("NoiseLingo") поверх NoiseSocket (отсюда "NoiseLingoSocket"). Он основан на идеях из 1. [45]
Для этого нужен измененный проект NoiseSocket с изменениями из 2 [46] (переименование нескольких вещей и изменение расчета пролога для дифференциации случая «повторной попытки» и добавления пролога приложения):
- Структура NLS [47]
- Протокол NoiseSocket [48]
В проекте NLS также определены некоторые «базовые профили», которые представляют собой высокоуровневые протоколы, используемые разработчиками приложений:
- NoiseLink (рукопожатие 1-RTT)
- NoiseZeroLink (рукопожатие 0-RTT)
- NoiseShortLink (для встроенных систем низкого уровня)
- NoiseAnonBox (шифрование с открытым ключом)
- NoseAuthBox (шифрование с открытым ключом + аутентификация отправителя)
Идея заключается в том, что NoiseLingo и NLS предоставляют вам меню полей согласования, из которых легко выбирать для создания профилей. Кроме того, эти профили будут иметь много общего и, таким образом, потенциал для взаимодействия (например, клиент NoiseZeroLink может общаться с сервером NoiseLink, откатываясь к 1-RTT). И если вы начнете с чего-то простого, например, NoiseLink, будет легко добавлять новые поля NLS и параметры согласования по мере обнаружения новых потребностей.
Приложение, построенное на Noise, должно учитывать несколько вопросов: [49]
25519
Функции DH рекомендуются для типичного использования, хотя 448
функции DH могут обеспечить дополнительную безопасность в случае разработки криптоаналитической атаки против эллиптической кривой криптографии. 448
Функции DH следует использовать с 512-битным хешем, например SHA512
, или BLAKE2b
. 25519
Функции DH можно использовать с 256-битным хешем, например SHA256
, или BLAKE2s
, хотя 512-битный хеш может обеспечить дополнительную безопасность в случае разработки криптоаналитической атаки против меньших хеш-функций. AESGCM
трудно реализовать с высокой скоростью и постоянным временем в программном обеспечении.В этом разделе собраны различные соображения по безопасности: [50]
Noise_NK_25519
инициатор может отправить недействительный эфемерный открытый ключ, чтобы вызвать известный вывод DH из всех нулей, несмотря на то, что он не знает статический открытый ключ ответчика. Если стороны хотят аутентифицироваться с помощью общего секрета, его следует использовать как PSK.Initialize()
должно однозначно идентифицировать комбинацию шаблона рукопожатия и криптографических функций для каждого ключа, с которым оно используется (будь то пара эфемерных ключей, пара статических ключей или PSK). Если тот же секретный ключ был повторно использован с тем же именем протокола, но другим набором криптографических операций, то могут возникнуть плохие взаимодействия.AESGCM
функции шифрования постепенно снижают безопасность по мере увеличения объема данных, зашифрованных одним ключом. В связи с этим стороны не должны отправлять более 2 56 байт (примерно 72 петабайта), зашифрованных одним ключом. Если возможна отправка таких больших объемов данных, следует выбирать другие функции шифрования.Язык | Имя |
---|---|
С | Шум-С [51] |
С# | Шум.NET [52] |
CLI | шумный кот [53] |
Эрланг | шум [54] |
Ява | Шум-Java [55] |
JavaScript/WASM | noise-c.wasm [56] (из Noise-C) |
Хаскелл | какофония [57] |
Идти | шум [58] |
Идти | Найквист [59] |
Идти | ШумПодключи и играй [60] |
Objective-C | Noise.framework [61] (фреймворк, совместимый с macOS и iOS, дружественный к Swift) |
Питон | протокол шума [62] |
Питон | Диссонанс [63] |
Ракетка | шум-протокол [61] |
Рубин | Шум [64] |
Ржавчина | Снег [65] |
Ржавчина | Шум-ржавчина [66] |
Разработка фреймворка Noise и TLS 1.3 охватывала период с 2014 по 2018 год. Первый черновик RFC 8446 [69] был в августе 2014 года, что привело к выпуску предлагаемого стандарта в августе 2018 года после 28 черновиков. В списке рассылки была короткая ветка [70] со сравнением с OPTLS
предложением. [71]
Некоторые другие применения шума в общем криптографическом смысле:
Презентации: