2010-06-03 4 views
7

Я использую jsp и сервлеты в своем веб-приложении. Мне нужно хранить пароли в базе данных. Я обнаружил, что хеширование будет лучшим способом сделать это. Я использовал этот код для этого.Как хранить пароли в базе данных?

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

Когда я попытался напечатать значение ТМП, я получаю некоторые другие value.i угадать его хэш-значение пароля. Но когда я сохраняю эти данные в базе данных, исходный пароль сохраняется там, кроме значения в tmp ..

Я использую java derby в качестве базы данных.

В чем проблема ???

+4

показать нам некоторые из кода БД. Кроме того, вы должны использовать [соль] (http://en.wikipedia.org/wiki/Salt_%28cryptography%29). –

+3

Obligatory Coding Horror статья: http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html –

ответ

5
  1. Добавить salt. Например, добавьте электронное письмо к паролю перед хэшированием. Это предотвратит использование rainbow tables
  2. Убедитесь, что вы используете tmp в своем запросе INSERT, а не на исходном пароле.
  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

8

Apache имеет библиотеку достояния, а именно 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

+0

вам нужно установить login.setPassword (tmp) – krico

Смежные вопросы