代码之家  ›  专栏  ›  技术社区  ›  rgksugan

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

  •  8
  • rgksugan  · 技术社区  · 15 年前

    我在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中的值。

    我使用Java Dybe作为数据库。

    有什么问题????

    3 回复  |  直到 15 年前
        1
  •  5
  •   Bozho    15 年前
    1. 添加 salt . 例如,在散列前将电子邮件附加到密码。这将阻止使用 rainbow tables
    2. 确保使用 tmp 在你 INSERT 查询,而不是原始密码。
    3. 不要使用 BASE64Encoder . 它是太阳内部图书馆的一部分,随时可能改变。使用 commons-codec Base64
        2
  •  8
  •   krico    15 年前

    阿帕奇有一个公共图书馆,即 Commons Codec 这使得对密码进行编码变得更容易。它将为你完成整个工作。

    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);
    
        3
  •  0
  •   HZhang    15 年前

    试试这个,它应该管用。

        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();
        }
    
    }
    

    }