2010-06-03 14 views
7

Uso jsp y servlets en mi aplicación web. Necesito almacenar contraseñas en la base de datos. Descubrí que el hash sería la mejor manera de hacerlo. Utilicé este código para hacerlo.cómo almacenar contraseñas en la base de datos?

   <%@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"); 
       } 
    %> 

cuando traté de imprimir el valor de tmp, consigo alguna otra value.i adivinar su valor hash de la contraseña. Pero cuando persista estos datos en la base de datos, la contraseña original se guarda allí aparte del valor en tmp ...

Estoy usando Java derby como la base de datos.

¿Cuál es el problema ???

+4

nos muestran algunos de su código db. Además, debe usar un [salt] (http://en.wikipedia.org/wiki/Salt_%28cryptography%29). –

+3

Obligatory Coding Horror artículo: http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html –

Respuesta

5
  1. Agregar salt. Por ejemplo, agregue el correo electrónico a la contraseña antes de hacer hash. Esto evitará el uso de rainbow tables
  2. Asegúrese de utilizar tmp en su consulta INSERT, en lugar de la contraseña original.
  3. No utilice BASE64Encoder. Es parte de las bibliotecas internas de Sun y está sujeta a cambios. Use commons-codecBase64
0

Pruebe esto, debería funcionar.

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

pero obtengo un valor hash cuando uso el algoritmo. El problema es cuando Persisto los datos en la base de datos, el valor hash no se almacena en la base de datos, pero el valor original se almacena – rgksugan

8

Apache tiene una biblioteca bien común, a saber Commons Codec, que hace que sea más fácil para codificar la contraseña. Hará todo el trabajo por ti.

import org.apache.commons.codec.digest.DigestUtils; 

String pw = DigestUtils.sha256Hex(password); 

O si quieres base 64:

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

, pero obtengo un valor hash cuando uso el algoritmo. El problema es cuando persisto los datos en la base de datos el valor hash no se almacena en la base de datos, pero el valor original se almacena. – rgksugan

+0

tiene que establecer login.setPassword (tmp) – krico

Cuestiones relacionadas