Хранение закрытых ключей в базе данных
Мне нужно хранить закрытые ключи для нескольких пользователей, чтобы мое серверное приложение могло подписывать файлы от их имени.
Я хочу надежно хранить закрытые ключи, но я не мог найти лучших практик вокруг этого. Если бы я хранил пароль, я бы Солт+хэш пароль, чтобы сделать хэш, который нельзя легко превратить обратно в пароль. Однако с закрытым ключом мне нужно сохранить его таким образом, чтобы я мог позже его получить.
Я думал, что зашифрую закрытый ключ, а затем сохраните его в моей базе данных. Первоначально я думал, что каждый ключ будет зашифрован другим паролем (на основе некоторых свойств пользователя). Однако эти свойства, скорее всего, будут храниться в базе данных, поэтому, если моя база данных просочилась, у злоумышленника есть все.
Я мог бы зашифровать все закрытые ключи одним паролем, который известен только моему приложению. Тогда злоумышленнику придется украсть мою базу данных и мое приложение, чтобы сделать что-либо вред.
есть ли техника / лучшая практика, которую я пропускаю?
1 ответов
вы можете зашифровать закрытый ключ с помощью симметричного ключа на основе пароля пользователя. Просто сохраните дополнительную соль и выполните пароль "хэш", чтобы получить отдельный ключ. Затем используйте его как ключ для шифрования закрытого ключа. Обратите внимание, что для создания безопасного хэша пароля, пароль на основе ключ используется функция Деривации (PBKDF), такая как PBKDF2, bcrypt или scrypt.
Если пользователь не находится в сети в то время, когда необходимо создать подпись, то вы должны действительно, защитите пароли в том смысле, что только вы / наш backoffice можете расшифровать ключи. Вы можете использовать некоторый идентификатор пользователя + свой собственный секретный ключ для вычисления ключа шифрования/дешифрования. Вы даже можете создать отдельную пару ключей RSA для дешифрования шифрования (используя гибридное шифрование).
хранение закрытых ключей от имени пользователей-очень опасная вещь. Существует множество способов потерять данные или открыть закрытый ключ (например, боковой канал атаки.) Чтобы сделать это профессионально, вы действительно должны использовать HSM где-то в процессе. Если это для каких-либо серьезных данных, пожалуйста, проконсультируйтесь с профессионалом и адвокатом.