Java 如何在数据库中存储密码?

Java 如何在数据库中存储密码?,java,passwords,hash,Java,Passwords,Hash,我在web应用程序中使用jsp和servlet。我需要在数据库中存储密码。我发现散列将是最好的方法。 我用这个代码来做这件事 <%@page import="com.jSurvey.entity.*" %> <%@page import="java.security.MessageDigest" %> <%@page import="java.security.NoSuchAlgorithmException"

我在web应用程序中使用jsp和servlet。我需要在数据库中存储密码。我发现散列将是最好的方法。 我用这个代码来做这件事

                <%@page import="com.jSurvey.entity.*"    %>
    <%@page import="java.security.MessageDigest" %>
    <%@page import="java.security.NoSuchAlgorithmException" %>
    <%@page import="java.math.BigInteger" %>
    <%@page import="com.jSurvey.controller.*" %>
    <%@page import="sun.misc.BASE64Encoder" %>
    <%try {
                    String user = request.getParameter("Username");
                    String pass = request.getParameter("Password1");
                    String name = request.getParameter("Name");
                    String mail = request.getParameter("email");
                    String phone = request.getParameter("phone");
                    String add1 = request.getParameter("address1");
                    String add2 = request.getParameter("address2");
                    String country = request.getParameter("country");
                    Login login = new Login();
                    Account account = new Account();

                    login.setId(user);
                    login.setPassword(pass);
                    if (!(add1.equals(""))) {
                        account.setAddress1(add1);
                    }
                    if (!(add2.equals(""))) {
                        account.setAddress2(add2);
                    }
                    if (!(country.equals(""))) {
                        account.setCountry(country);
                    }
                    account.setId(user);
                    account.setMail_id(mail);
                    if (!(phone.equals(""))) {
                        account.setPhone_no(Long.parseLong(phone));
                    }
                    account.setName(name);
                    java.security.MessageDigest d = null;
                    d = java.security.MessageDigest.getInstance("SHA-1");
                    d.reset();
                    d.update(pass.getBytes("UTF-8"));
                    byte b[] = d.digest();
                    String tmp = (new BASE64Encoder()).encode(b);

                    account.setPassword(tmp);
                    account.setPrivilege(1);
                    LoginJpaController logcon = new LoginJpaController();
                    AccountJpaController acccon = new AccountJpaController();
                    logcon.create(login);
                    acccon.create(account);
                    session.setAttribute("user", user);
                    response.sendRedirect("dashboard.jsp");
                } catch (NumberFormatException ex) {
                    out.println("Invalid data");
                }
    %>

当我试图打印tmp的值时,我得到了一些其他值。我猜这是密码的哈希值。但是,当我将这些数据持久化到数据库时,原始密码会保存在那里,而不是tmp中的值

我使用JavaDerby作为数据库

有什么问题

  • 加上。例如,在散列之前将电子邮件附加到密码。这将防止使用
  • 确保在
    INSERT
    查询中使用
    tmp
    ,而不是原始密码
  • 不要使用
    base64编码器
    。它是Sun内部库的一部分,可能会发生变化。使用
    Base64

  • 试试这个,应该有用

        import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    public class MD5 {
    
    public static void main(String[] args) {
        try{
            MessageDigest alg = MessageDigest.getInstance("MD5");
            String password = "123456";
            alg.reset();
            alg.update(password.getBytes());
            byte[] msgDigest = alg.digest();
    
            BigInteger number = new BigInteger(1,msgDigest);
    
            String str = number.toString(16);
            System.out.println(str);
    
        }catch(NoSuchAlgorithmException e){
            e.printStackTrace();
        }
    
    }
    

    }Apache有一个公共库,即,它使密码编码更容易。它将为您完成全部工作

    import org.apache.commons.codec.digest.DigestUtils;
    
    String pw = DigestUtils.sha256Hex(password);
    
    或者,如果您想要base64:

    import org.apache.commons.codec.digest.DigestUtils;
    import org.apache.commons.codec.binary.Base64;
    
    byte[] pwBytes = DigestUtils.sha(password);
    String b64Pass = Base64.encodeBase64String(pwBytes);
    

    给我们看看你的数据库代码。此外,您还应该使用一篇.responsive Coding恐怖文章:但是当我使用该算法时,会得到一个哈希值。问题是,当我将数据持久化到数据库中时,哈希值不会存储在数据库中,而是存储了原始值。您必须设置login.setPassword(tmp)但当我使用该算法时会得到一个散列值。问题是当我将数据持久化到数据库中时,散列值不会存储在数据库中,而是存储原始值