Как преобразовать введенный на форму пароль в хэшированный вид?

Рейтинг: 0Ответов: 2Опубликовано: 16.10.2014

Здравствуйте. Подскажите, пожалуйста, как правильно сделать, чтобы введенный при регистрации пользователем пароль преобразовывался в хэшированный вид, но уже после того как пройдет валидация на форме. У меня пароль хэшируется, но не возможно, например, сделать ограничение на количество введенных символов, так как сгенерированный хэшированный пароль всегда состоит из 60 символов, а также для полей password и confirmPassword генерируются разные пароли.

package com.springapp.mvc.domain;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "user")
public class User implements Serializable{

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String surname;
    @Column(columnDefinition = "enum('male','female')")
    @Enumerated(EnumType.STRING)
    private Gender gender = Gender.male;
    private Date birthdate;
    private String address;
    private String tel;
    private String email;

    private String login;
    private String password;
    private String confirmPassword;
    private boolean enabled;
    @ManyToOne
    @JoinColumn(name = "category_id")
    private Category category;
    private String comment;

   ...

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        //this.password = password;
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String hashedPassword = passwordEncoder.encode(password);
        this.password = hashedPassword;
    }

    public String getConfirmPassword() {
        return confirmPassword;
    }

    public void setConfirmPassword(String confirmPassword) {
        //this.confirmPassword = confirmPassword;
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String hashedPassword = passwordEncoder.encode(confirmPassword);
        this.confirmPassword = hashedPassword;
    }

   ...
}

signup.jsp:

 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
 <%@ page session="false" %>
 <%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
 <%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
 <%@ taglib prefix="calendar" uri="http://java.sun.com/jsp/jstl/fmt" %>
 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
 <t:template>
 <form:form method="post" action="/add" commandName="user">
    <div class="form">
        <table>
            ...
          <tr>
                <td><form:label path="login">
                    <spring:message code="label.login"/>:</form:label></td>
                <td><form:input path="login"/></td>
                <td><span class="error2"><form:errors path="login"/></span></td>
            </tr>

           <tr>
                <td><form:label path="password">
                    <spring:message code="label.password"/>:</form:label></td>
                <td><form:password path="password"/></td>
                <td><span class="error2"><form:errors path="password"/></span></td>
            </tr>

            <tr>
                <td><form:label path="confirmPassword">
                    <spring:message code="label.confirmpassword"/>:</form:label></td>
                <td><form:password path="confirmPassword"/></td>
                <td><span class="error2"><form:errors path="confirmPassword"/></span></td>
            </tr>
               ...
            <tr>
                <td colspan="3"><span class="signup-button"><input type="submit"
                         value="<spring:message code="label.add"/>"/></span>
                </td>
            </tr>
        </table>
    </div>
</form:form>
</t:template>

Ответы

▲ 2Принят

Очевидно, нужно применить к нему хэш-функцию. Например, MD5.

▲ 2

Хэширование должно производиться на стороне клиента, как бы нельзя посылать пароль по открытому настежь каналу :)

В общем, надо средствами JavaScript перехватывать при сабмите (по-моему, типа onSubmit()) и отправлять серверу уже хэшированную строку.

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

Возьмите страничку входа в gmail.com и посмотрите на сгенерированную HMTL страничку - немало загадок увидите там :)