Как сохранить ключ, используемый для расшифровки во время выполнения веб-приложения - PullRequest
1 голос
/ 16 декабря 2011

Как можно безопасно хранить объект криптографического ключа типа javax.crypto.SecretKey во время сеанса пользователя в веб-приложении Java?Я должен управлять таким ключом, потому что я могу создать этот ключ только после входа в систему, но мне может понадобиться этот ключ позже для некоторой расшифровки конфиденциальных пользовательских данных.

SecretKey сам по себе выводится из пароля пользователя функциями, основанными на пароле (в настоящее время "PBKDF2WithHmacSHA1").Используемая соль и количество итераций сохраняются в базе данных.С этими параметрами - пароль, соль и итерации - я могу воссоздать этот пароль сразу после входа в систему, когда пароль будет доступен.После этого я хотел бы сохранить сгенерированный ключ в памяти, в отличие от того, чтобы постоянно сохранять простой пароль.

Поскольку я использую Spring / Hibernate, безопасно ли помещать этот ключевой объект вбин с областью действия сеанса?Такой объект существует только в памяти и должен быть безопасным, не так ли?

Общий вопрос: возможно ли создать безопасную среду, если время, в течение которого секретный ключ доступен, отличается от времени, в течение которого этот ключ долженИспользуется даже на несколько минут?

1 Ответ

3 голосов
/ 16 декабря 2011

Все зависит от того, какое у вас требование / определение «безопасно» для этого проекта.

Хранение секретного ключа в памяти в области сеанса является «безопасным» с точки зрения того, что он теоретически не должен быть доступен из других сеансов. Если, конечно, в Spring, веб-контейнере или в вашем коде нет ошибок или уязвимостей безопасности - взгляните, например, на перехват сеанса , убедитесь, что вы понимаете потенциальные риски.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...