mirror of https://github.com/voidlizard/hbs2
117 lines
4.4 KiB
Markdown
117 lines
4.4 KiB
Markdown
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"
|
||
|
||
```
|
||
|
||
|