4.4 KiB
PEP-02: acb-and-initial-encrypting-scheme
Задача: шифровать контент таким образом, что бы его могло получать несколько [1..n], n ~ в перспективе сотни? получателей.
Предлагаемое решение:
Вводим ACB, Access Control Block.
ACB определяет права различных подписчиков на единицу контента.
Ключи шифрования контента определяется из ACB.
На первоначальном этапе предлагается использовать пару ключей Curve25519 (?), т.е ключевую пару асимметричного шифрования libsodium (haskell: saltine), так как тесты показали заметно более высокую скорость по сравнению с шифрованием симметричным ключом (AES).
В любом случае, предполагается в будущем использовать и другие схемы контроля доступа к контенту, таким образом, возможность расширения должна быть заложена в структуры данных.
data family ACB ( s :: EncryptionSchema ) e
data instance ACB 'NaClAsymm e =
ACB1
{ _acbRoot :: !(Maybe (PubKey 'Sign e))
, _acbOwners :: ![PubKey 'Sign e]
, _acbReaders :: ![PubKey 'Encrypt e]
, _acbWriters :: ![PubKey 'Sign e]
, _acbPrev :: !(Maybe HashRef)
}
Что бы подписчик мог что-то публиковать (write), мы должны знать его публичный ключ подписи, что бы её проверять и принимать, или отвергать данные.
Что бы подписчик мог что-то читать, мы должны знать его публичный ключ шифрования, что бы он мог расшифровать публикуемый контент.
ACB не является закрытой информацией и может быть как опубликован, так и сохранён локально. Утечка ACB не является проблемой за исключением раскрытия принадлежности ключа шифрования к ключу подписи.
Список пар (ключ подписи пользователя, ключ шифрования). Пара необходима, что бы пользователи за O(1) найти и расшифровать свой ключ.
Операции:
- Добавить право на чтение
- Добавить право на публикацию
- Удалить право на чтение
- Удалить право на публикацию
- Добавить владельца
- Удалить владельца
- Создать новый ключ публикации
Создать новый ключ публикации
- Получить ACB
- Для каждого подписчика на чтение добавить зашифрованный ключ в permitted
Публикация
- Взять ключ публикации
- Расшифровать свой экземпляр ключа (KeyPair)
- Шифровать расшифрованным ключом блоки
Чтение
- Определить ключ публикации
- Взять ключ публикации
- Расшифровать свой экземпляр ключа (KeyPair)
- Расшифровывать этим ключом блоки
Текстовый формат ACB
Конфигурационный файл следующего вида:
define-acb a1 ;; определить acb с идентификатором a1
;; добавить root с ключом "sRyP45vd7wnopdLP6MLxUJAFGJu5wGVHyzF64mKwBbH"
acb-root a1 "sRyP45vd7wnopdLP6MLxUJAFGJu5wGVHyzF64mKwBbH"
;; добавить owner с ключом "EJgvBg9bL2yKXk3GvZaYJgqpHy5kvpXdtEnAgoi4B5DN"
acb-owner a1 "EJgvBg9bL2yKXk3GvZaYJgqpHy5kvpXdtEnAgoi4B5DN"
;; добавить читателя с ключом
acb-reader a1 "5k9rLmFdXCP4RncG9WHEaXXEjxvnxmBvvMUqcKkoY45q"
;; добавить писателя с ключом
acb-writer a1 "sRyP45vd7wnopdLP6MLxUJAFGJu5wGVHyzF64mKwBbH"