为了避免用户密码直接裸露存储在数据库中,应对用户密码进行加密,有些数据库就有加密函数,比如oracle,有个示例如下,进行对密码字段加密:
CREATE OR REPLACE function md5(input_string VARCHAR2) return varchar2
IS
raw_input RAW(128) := UTL_RAW.CAST_TO_RAW(input_string);
decrypted_raw RAW(2048);
error_in_input_buffer_length EXCEPTION;
BEGIN
--dbms_output.put_line(sysdate || '> 加密前的数据:' || input_string);
sys.dbms_obfuscation_toolkit.MD5(input => raw_input,
checksum => decrypted_raw);
--dbms_output.put_line(sysdate || '> 加密后的数据:' || rawtohex(decrypted_raw));
return lower(rawtohex(decrypted_raw));
END;
而这个方法也存在缺陷性,只适合某一特定的数据库,一旦数据库换了(不是所有数据库都有加密解密存储函数),这个加密方法就不能用了。
本文要讨论的是用java方法对数据进行MD5码的加密,相对也是比较简单,因为java有现成的类java.security,MessageDigest帮我们生成MD5码。
思路是把密码字符窜进行MD5码的转换存储在数据库中,用户登入的时候把登入输入的密码字符窜进行MD5码的转换,再与数据库中存储的密码MD5码进行比较;如用户修改密码就拿新的密码的MD5码进行替换。
生成MD5码的函数如下:
/**
* 把字符窜转化成MD5码,主要针对密码
* @param str 待转码的字符窜
* @return MD5码字符窜
* @author Tony Lin Added on 2008-9-27
*/
public String getMD5String(String str){
try{
byte psw[] = str.getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(psw);
return this.toHex(md.digest());
} catch (IllegalStateException e) {
return null;
} catch (NoSuchAlgorithmException e) {
return null;
}
}
/**
* 把byte型数组类容拼错成字符窜
* @param buffer The byte array to be converted
* @return String
* @author Tony Lin Added on 2008-9-27
*/
public String toHex(byte buffer[]) {
StringBuffer sb = new StringBuffer();
String s = null;
for (int i = 0; i < buffer.length; i++) {
s = Integer.toHexString((int) buffer[i] & 0xff);
if (s.length() < 2) {
sb.append('0');
}
sb.append(s);
}
return sb.toString();
}
CREATE OR REPLACE function md5(input_string VARCHAR2) return varchar2
IS
raw_input RAW(128) := UTL_RAW.CAST_TO_RAW(input_string);
decrypted_raw RAW(2048);
error_in_input_buffer_length EXCEPTION;
BEGIN
--dbms_output.put_line(sysdate || '> 加密前的数据:' || input_string);
sys.dbms_obfuscation_toolkit.MD5(input => raw_input,
checksum => decrypted_raw);
--dbms_output.put_line(sysdate || '> 加密后的数据:' || rawtohex(decrypted_raw));
return lower(rawtohex(decrypted_raw));
END;
而这个方法也存在缺陷性,只适合某一特定的数据库,一旦数据库换了(不是所有数据库都有加密解密存储函数),这个加密方法就不能用了。
本文要讨论的是用java方法对数据进行MD5码的加密,相对也是比较简单,因为java有现成的类java.security,MessageDigest帮我们生成MD5码。
思路是把密码字符窜进行MD5码的转换存储在数据库中,用户登入的时候把登入输入的密码字符窜进行MD5码的转换,再与数据库中存储的密码MD5码进行比较;如用户修改密码就拿新的密码的MD5码进行替换。
生成MD5码的函数如下:
/**
* 把字符窜转化成MD5码,主要针对密码
* @param str 待转码的字符窜
* @return MD5码字符窜
* @author Tony Lin Added on 2008-9-27
*/
public String getMD5String(String str){
try{
byte psw[] = str.getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(psw);
return this.toHex(md.digest());
} catch (IllegalStateException e) {
return null;
} catch (NoSuchAlgorithmException e) {
return null;
}
}
/**
* 把byte型数组类容拼错成字符窜
* @param buffer The byte array to be converted
* @return String
* @author Tony Lin Added on 2008-9-27
*/
public String toHex(byte buffer[]) {
StringBuffer sb = new StringBuffer();
String s = null;
for (int i = 0; i < buffer.length; i++) {
s = Integer.toHexString((int) buffer[i] & 0xff);
if (s.length() < 2) {
sb.append('0');
}
sb.append(s);
}
return sb.toString();
}