2010-06-03 49 views
7

Tôi sử dụng jsp và servlet trong ứng dụng web của mình. tôi cần lưu trữ mật khẩu trong cơ sở dữ liệu. Tôi thấy rằng băm sẽ là cách tốt nhất để làm điều đó. Tôi đã sử dụng mã này để làm điều đó.cách lưu trữ mật khẩu trong cơ sở dữ liệu?

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

Khi tôi cố gắng in giá trị của tmp, tôi nhận được một số giá trị khác.i đoán giá trị băm của mật khẩu. Nhưng khi tôi lưu dữ liệu này vào cơ sở dữ liệu, mật khẩu ban đầu được lưu ở đó ngoài giá trị trong tmp ..

Tôi đang sử dụng derby java làm cơ sở dữ liệu.

Vấn đề là gì ???

+4

Hiện chúng tôi một số mã db của bạn. Ngoài ra, bạn nên sử dụng [muối] (http://en.wikipedia.org/wiki/Salt_%28cryptography%29). –

+3

Mã hóa bắt buộc Bài viết kinh dị: http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html –

Trả lời

5
  1. Thêm salt. Ví dụ: thêm email vào mật khẩu trước khi băm. Điều này sẽ ngăn việc sử dụng rainbow tables
  2. Đảm bảo bạn sử dụng tmp trong truy vấn INSERT của mình, thay vì mật khẩu ban đầu.
  3. Không sử dụng BASE64Encoder. Nó là một phần của thư viện nội bộ của Sun và có thể thay đổi. Sử dụng commons-codecBase64
0

Hãy thử tính năng này sẽ hoạt động.

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

nhưng tôi nhận được giá trị băm khi tôi sử dụng thuật toán. Vấn đề là khi nào Tôi lưu trữ dữ liệu vào cơ sở dữ liệu giá trị băm không được lưu trữ trong cơ sở dữ liệu nhưng giá trị ban đầu được lưu trữ – rgksugan

8

Apache có một thư viện commons, cụ thể là Commons Codec, mà làm cho nó dễ dàng hơn để mã hóa mật khẩu. Nó sẽ làm toàn bộ công việc cho bạn.

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

String pw = DigestUtils.sha256Hex(password); 

Hoặc nếu bạn muốn 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

nhưng tôi nhận được giá trị băm khi tôi sử dụng thuật toán.the vấn đề là khi tôi lưu dữ liệu vào cơ sở dữ liệu giá trị băm không được lưu trữ trong cơ sở dữ liệu nhưng giá trị ban đầu được lưu trữ. – rgksugan

+0

bạn phải đặt login.setPassword (tmp) – krico

Các vấn đề liên quan