[英]how to store passwords in database?
我在我的Web應用程序中使用jsp和servlet。 我需要在數據庫中存儲密碼。 我發現哈希將是最好的方法。 我用這個代碼來做。
<%@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的值時,我得到了一些其他值。我猜它是密碼的哈希值。 但是當我將這些數據保存到數據庫時,原始密碼將被保存在那里,而不是tmp中的值。
我使用java derby作為數據庫。
問題是什么???
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);
INSERT
查詢中使用tmp
,而不是原始密碼。 BASE64Encoder
。 它是Sun內部庫的一部分,可能會發生變化。 使用commons-codec Base64
試試這個它應該工作。
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();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.