2010-06-03 87 views
7

我在我的web应用程序中使用jsp和servlets。我需要将密码存储在数据库中。我发现哈希将是最好的方式来做到这一点。 我用这个代码来做到这一点。如何在数据库中存储密码?

   <%@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的值,我得到一些其他value.i猜测它的密码的哈希值。但是,当我坚持这个数据到数据库的原始密码被保存在那里,而不是在tmp中的值..

我使用java derby作为数据库。

是什么问题?

+4

显示我们一些您的数据库代码。另外,你应该使用[salt](http://en.wikipedia.org/wiki/Salt_%28cryptography%29)。 – 2010-06-03 06:06:33

+3

Obligatory Coding恐怖文章:http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html – 2010-06-03 06:33:54

回答

5
  1. 添加salt。例如,在散列之前将电子邮件附加到密码。这会阻止使用rainbow tables
  2. 请确保在INSERT查询中使用tmp,而不是原始密码。
  3. 请勿使用BASE64Encoder。它是Sun内部图书馆的一部分,可能会发生变化。使用commons-codecBase64
0

试试这个应该有效。

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

} 

}

+0

但我得到一个哈希值,当我使用该算法。问题是什么时候我坚持把数据存入数据库,散列值没有存储在数据库中,但原始值存储在 – rgksugan 2010-06-04 05:39:24

8

阿帕奇有一个公共图书馆,即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); 
+0

中,但是当我使用该算法时,我得到了散列值。问题是当我将数据持久化到数据库中时,散列值没有存储在数据库中,但存储了原始值。 – rgksugan 2010-06-04 05:34:18

+0

你必须设置login.setPassword(tmp) – krico 2010-06-04 22:10:59

相关问题