Сохранение секретных ключей в базе данных

Мне нужно хранить личные ключи для нескольких пользователей, чтобы мое серверное приложение могло подписывать файлы от их имени.

Я хочу хранить секретные ключи надежно, но я не мог найти лучшие практики вокруг этого. Если бы я хранил пароль, я бы соел + хеш пароль, чтобы сделать хэш, который нельзя легко вернуть обратно в пароль. Тем не менее, с закрытым ключом мне нужно сохранить его таким образом, чтобы я мог позже его восстановить.

Я думал, что буду шифровать закрытый ключ, а затем хранить его в своей базе данных. Первоначально я думал, что каждый ключ будет зашифрован другим паролем (на основе некоторых свойств пользователя). Однако эти свойства, скорее всего, будут храниться в базе данных, поэтому, если моя база данных просочилась, у злоумышленника есть все.

Я мог бы зашифровать все закрытые ключи одним паролем, который известен только моему приложению. Тогда злоумышленнику придется украсть мою базу данных, а мое приложение - нанести какой-либо вред.

Есть ли техника/лучшая практика, которую я пропускаю?

Ответ 1

Вы можете зашифровать закрытый ключ симметричным ключом на основе пароля пользователя. Просто сохраните дополнительную соль и введите пароль "хэш", чтобы получить отдельный ключ. Затем используйте его в качестве ключа для шифрования закрытого ключа. Обратите внимание, что для создания безопасного хэша пароля необходимо использовать функцию получения ключа на основе пароля (PBKDF), такую как PBKDF2, bcrypt или scrypt (учитывая нормальный уровень безопасности пароля).

Если пользователь не подключен к сети в то время, когда необходимо сгенерировать подпись, тогда вы действительно должны защитить пароли в том смысле, что только вы/наш офис может расшифровать ключи. Вы можете использовать некоторый идентификатор пользователя + свой собственный секретный ключ для вычисления ключа шифрования/дешифрования. Возможно, вы даже захотите сгенерировать отдельную пару ключей RSA для выполнения гибридного шифрования.

Хранение закрытых ключей от имени пользователей - очень опасная практика. Существует множество способов раскрытия секретного ключа (например, атаки по побочным каналам). Чтобы сделать это профессионально, вы должны использовать HSM где-то в процессе. Если это для каких-либо серьезных данных, пожалуйста, обратитесь к профессионалу и юристу.