]> Sergey Matveev's repositories - stargrave-blog.git/commitdiff
YA P2P IM с E2EE
authorSergey Matveev <stargrave@stargrave.org>
Tue, 29 Jan 2019 07:29:46 +0000 (10:29 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Tue, 29 Jan 2019 07:39:45 +0000 (10:39 +0300)
https://habr.com/ru/post/437686/
Статья про то, как автор на Go легко написал peer-to-peer messenger с
end-to-end шифрованием. Мне то конечно сразу интересно было посмотреть
как он устроил шифрование. Вот честно -- лучше бы вообще не брался. Не
знает базовых азов.

* шифрование без аутентификации -- сразу просто выкинуть в помойку
* обмен ключами, насколько вижу, тоже без аутентификации -- MitM легко
* padding ориентируется на просто отрезание нулевых байт в конце --
  накладывает ограничения на допустимый payload прикладного протокола.
  Зачем? Кроме того, это допускает "прохождение" изменённых пакетов, так
  как никакой аутентификации нет
* curve25519 почему-то использует ключи сгенерированные ed25519 -- там
  генерация настолько простая и тривиальная (urandom(32)), что это
  просто глупость полная, но ok -- на безопасность не влияет
* CBC-режим? Нет, ну он имеет право на существование, но должна быть
  веская причина. Если её нет, то плохой режим: требует padding,
  реализации и функции шифрования и дешифрования, не распараллеливается,
  относительно небольшое количество блоков может быть зашифровано на
  одном ключе

И ведь он пишет на Go. Буквально достаточно было бы просто CBC поменять
на GCM, который имеется в библиотеках и: аутентификация сообщения,
отсутствие padding, распараллелизация возможна (хотя я не поклонник GCM).
Вот и Дуров со своей командой как-то так и делали свой IM, хотя он
получше всё же этого.

Лучшим вариантом было бы использование Noise. Если не хочется, то уж
хотя бы использовать golang.org/x/crypto/nacl/secretbox.


No differences found