Понадобилось прикрутить шифрование к программе. Почитал немного по этой теме.
Насколько я понял, подходит шифрование с закрытым ключом. Пароль пользователя будет являться закрытым ключом, на основе которого будут расшифровываться данные. Это понравилось мне тем, что при таком подходе не понадобится хранить пароль.
Но появилась проблема: пользователей несколько, соответственно пароли разные, а доступ нужен к общим данным.
Что можно сделать в этом случае?
Шифровать данные с помощью единого ключа, а ключ шифровать для каждого пользователя его паролем. Таким образом, каждый пароль открывает доступ к зашифрованным данным и компроментация одного пароля не затрагивает остальные _пароли_. Впрочем, зашифрованные данные можно скомпроментировать, имея любой из паролей.
З.Ы. Ключ в зашифрованном виде (для каждого пользователя по ключу) может храниться либо же с основной, зашифрованной информацией, либо же у каждого пользователя, что сути не меняет.
З.З.Ы. Чтобы злоумышленник, получив доступ к главному ключу (расшифрованному) и списку ключей, зашифрованных паролями пользователей, не смог получить пароли, следует при шифровании ключа с помощью паролей добавлять в конец случайные значения, различные для каждого пользователя.
Это — схема с использованием симметричных алгоритмов. Теоретически, используя асимметричные, можно наворотить и не такое =)
Вроде то что нужно…
Получается так:
1. Во время первого запуска программы, генерируется ключ к данным
2. Просим указать пароль администратора, этим паролем шифруем этот ключ и получаем зашифрованный ключ.
3. Создаем пользователя из под администратора и пользуясь расшифрованным ключом, генерируем новый зашифрованный ключ для пользователя.
Разделить данные на общие и приватные. Ключ от общих данных хранить в приватных данных каждого юзара, а ключ от приватных данных генерировать на основе пароля юзера.
>>Пароль пользователя будет являться закрытым ключом, на основе которого будут расшифровываться данные.
Уточнение.
Закрытый ключ — это термин асимметричной криптографии. Пароль не может быть закрытым ключом. Есть 2 основных алгоритма асимметричной криптографии: RSA и DSA (DSA есть для эллиптических кривых, ECDSA). Ни в одном из них нельзя использовать пароль в качестве закрытого ключа.
Хотя… меня сейчас осенила грандиозная идея — генерировать p и q (все время одинаковые) по паролю — тогда не нужно хранить закрытый ключ. Пошел думать эту мысль…