hbs2/docs/drafts/pep-02-acb.txt

96 lines
3.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PEP-02: acb-and-initial-encrypting-scheme
Задача: шифровать контент таким образом, что бы его
могло получать несколько [1..n], n ~ в перспективе сотни?
получателей.
Предлагаемое решение:
Вводим ACB, Access Control Block.
ACB представляет собой ключ шифрования, зашифрованный публичными
ключами предполагаемых получателей.
Схемы могу быть разные, так что какой конкретно этот ключ определяется
из самого ACB.
На первоначальном этапе предлагается использовать пару ключей
Curve25519 (?), т.е ключевую пару асимметричного шифрования libsodium
(haskell: saltine), так как тесты показали заметно более высокую
скорость по сравнению с шифрованием симметричным ключом (AES).
В любом случае, предполагается в будущем использовать и другие схемы
контроля доступа к контенту, таким образом, возможность расширения
должна быть заложена в структуры данных.
```
-- PubKey 'Sign e ;;; ключ подписи Ed25519
data ACBSchema = NaClAsymm
data family ACB e (schema :: ACBSchema) :: Type
data family AccessKey e schema :: Type
data instance ACB e 'NaClAsymm =
ACBNaClAsymm
{ acbParent :: HashRef -- указатель на предыдущий ACB
, acbRoot :: PubKey 'Sign e -- корневой владелец
, acbOwners :: [PubKey 'Sign e] -- ключи владельцев
, acbRead :: [(PubKey 'Sign e, PubKey 'Encrypt e)]
-- при чтении нужно расшифровывать и идентифицировать ключ
, acbWrite :: [(PubKey 'Sign e)]
-- при публикации нужно проверять подпись
}
```
Что бы подписчик мог что-то публиковать (write), мы должны знать его
публичный ключ подписи, что бы её проверять и принимать, или
отвергать данные.
Что бы подписчик мог что-то читать, мы должны знать его публичный ключ
шифрования, что бы он мог расшифровать публикуемый контент.
```
-- EncryptedBox - обертка вокруг ключа ассиметричного шифрования
-- (KeyPAir)
newtype instance AccessKey e 'NaClAsymm =
AccessKeyNaClAsymm
{ permitted :: [(PubKey 'Sign e, EncryptedBox)]
}
```
Список пар (ключ подписи пользователя, ключ шифрования).
Пара необходима, что бы пользователи за O(1) найти и
расшифровать свой ключ.
Операции:
- Добавить право на чтение
- Добавить право на публикацию
- Удалить право на чтение
- Удалить право на публикацию
- Добавить владельца
- Удалить владельца
- Создать новый ключ публикации
### Создать новый ключ публикации
- Получить ACB
- Для каждого подписчика на чтение добавить зашифрованный
ключ в permitted