Клиентское и серверное шифрование паролей в Java - PullRequest
2 голосов
/ 02 декабря 2011

Я делаю небольшой сайт социальной сети, используя Java / JSP. Я хочу, чтобы пароли были зашифрованы и затем сохранены в базе данных. Я хочу знать, что в настоящее время необходимо зашифровать пароли на стороне клиента с помощью javascript (sha1, md5, ..) и затем отправить его на сервер, или это достаточно безопасно, чтобы игнорировать стороны клиента и просто шифровать пароли на стороне сервера.

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Вам необходимо передать пароли между клиентом и сервером через TLS (SSL). Затем используйте bcrypt с коэффициентом затрат 16 или более (или PBKDF2 с итерациями 64k или более) для хеширования пароля на сервере.

2 голосов
/ 02 декабря 2011

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

Если вы используете SSL, то реализовать дополнительную защиту на стороне клиента будет мало. Единственный сценарий, в котором это может быть выгодно, - это когда злоумышленник может поставить под угрозу шифрование, но не целостность потока (поэтому он может только прослушивать данные). Это кажется маловероятным, но это возможно.

Для обеспечения дополнительной безопасности для предотвращения этого потребуется сначала хешировать пароль в соответствии с тем, как хешируется сервер (включая соль), а затем хешировать его с помощью предоставленного сервером случайно сгенерированного токена (который сервер также запоминает в сессия). Это гарантирует, что пароль не может быть получен кем-то, прослушивающим соединение (при условии, что целостность потока не нарушена), а также гарантирует, что хешированная версия не может быть использована при атаке воспроизведения (случайный токен сервера предотвращает его повторное использование). Если вы хэшируете пароль только на стороне клиента, ничто не мешает злоумышленнику просто использовать это хешированное значение для входа в систему. Помните, что это в дополнение к SSL, а не вместо него.

Независимо от способа передачи пароля, вы должны хранить только соленую хешированную версию пароля в вашей базе данных. В идеале следует использовать соль для каждого пользователя (которую вы также храните) и безопасную хеш-функцию (например, SHA-2 вместо SHA-1 или MD5).

1 голос
/ 02 декабря 2011

Лучший способ сделать это - использовать:

  1. SSL
  2. Клиентское и серверное шифрование.

Варианта 1 обычно достаточно, однако его все же можно прослушать, и поэтому может быть полезно отправить зашифрованную / зашифрованную версию. Эта отправленная версия не должна быть тем, что вы храните в базе данных, она должна иметь какую-то другую энтропию.

...