2010-06-03 10 views
7

J'utilise jsp et servlets dans mon application web. J'ai besoin de stocker les mots de passe dans la base de données. J'ai trouvé que le hachage serait le meilleur moyen de le faire. J'ai utilisé ce code pour le faire.comment stocker les mots de passe dans la base de données?

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

Lorsque j'ai essayé d'imprimer la valeur de tmp, je reçois un autre value.i deviner sa la valeur de hachage du mot de passe. Mais quand je persiste ces données à la base de données le mot de passe original y est sauvé autre que la valeur dans tmp ..

J'utilise java derby comme base de données.

Quel est le problème ???

+4

Montrez-nous un peu de votre code db. Aussi, vous devriez utiliser un [salt] (http://en.wikipedia.org/wiki/Salt_%28cryptography%29). –

+3

Horreur Codage Obligatoire article: http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html –

Répondre

5
  1. Ajouter salt. Par exemple, ajoutez l'e-mail au mot de passe avant le hachage. Cela empêchera l'utilisation de rainbow tables
  2. Assurez-vous que vous utilisez tmp dans votre requête INSERT, plutôt que le mot de passe d'origine.
  3. N'utilisez pas BASE64Encoder. Il fait partie des bibliothèques internes de Sun et est sujet à changement. Utiliser commons-codecBase64
0

Essayez-le, cela devrait fonctionner.

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

mais je reçois une valeur hashed lorsque j'utilise l'algorithme.le problème est quand je persiste les données dans la base de données la valeur hachée n'est pas stockée dans la base de données mais la valeur originale est stockée – rgksugan

8

Apache dispose d'une bibliothèque de biens communs, à savoir Commons Codec, qui le rend plus facile à coder le mot de passe. Il fera tout le travail pour vous.

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

String pw = DigestUtils.sha256Hex(password); 

Ou si vous voulez 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

mais j'obtiens une valeur hachée quand j'utilise l'algorithme. le problème est quand je persiste les données dans la base de données la valeur hachée n'est pas stocké dans la base de données mais la valeur d'origine est stockée. – rgksugan

+0

vous devez définir login.setPassword (tmp) – krico