mirror of https://github.com/voidlizard/hbs2
96 lines
3.7 KiB
Plaintext
96 lines
3.7 KiB
Plaintext
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
|
||
|