【发布时间】:2011-07-08 13:38:44
【问题描述】:
我有下一个麻烦。 在数据库中,从日期开始存储为 md5。当我在 JAVA 中从同一日期制作 md5 时,我有另一个哈希值。 例如:日期 - 01.02.1980 java 哈希是 addaf0f9a1fb3699871293f888f6e46e (与字符串中的 oracle md5 哈希相同) 预言机哈希为 DF0919EA828A77DC2CCF68474ED703AC
我尝试在 java 中重复 oracle 结果:
System.out.println(streamConvertor.getHash("01.02.1980", Boolean.TRUE));
System.out.println("");
System.out.println(streamConvertor.getHash("01.02.1980", Boolean.FALSE));
public String getMD5(String input, Boolean is_date) throws ParseException {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] mdinput;
Boolean pr;
if (input.equals("01.02.1980")) {
pr = true;
} else {
pr = false;
}
if (is_date == Boolean.TRUE) {
SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");
Date day = df.parse(input);
mdinput = df.format(day).getBytes();
} else {
mdinput = input.getBytes();
}
if (pr == Boolean.TRUE) {
System.out.println("Is date " + is_date + " - " + mdinput);
}
byte[] messageDigest = md.digest(mdinput);
if (pr == Boolean.TRUE) {
System.out.println("message - " + messageDigest);
}
BigInteger number = new BigInteger(1, messageDigest);
if (pr == Boolean.TRUE) {
System.out.println("Number - " + number);
}
String hashtext = number.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
if (pr == Boolean.TRUE) {
System.out.println("hashtext - " + hashtext);
}
return hashtext;
}
catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
和输出不同,但只有在 byte[] 转换为 BigInteger 之前:
Is date true - [B@4a65e0
message - [B@665753
Number - 231093251542199165689934828427325924462
hashtext - addaf0f9a1fb3699871293f888f6e46e
Is date false - [B@ef22f8
message - [B@1e0cf70
Number - 231093251542199165689934828427325924462
hashtext - addaf0f9a1fb3699871293f888f6e46e
是否有可能在 oracle 中制作 md5 哈希?
【问题讨论】:
-
你在 Oracle 中做什么来获取你的日期的 MD5 哈希?
-
存储在 bd 中的日期像这样选择 DBMS_CRYPTO.hash( UTL_RAW.CAST_TO_RAW( UPPER(to_date('01.02.1980', 'dd.mm.yyyy')) ),2 ) 从 dual ;
-
在这种情况下,oracle 使用 nls_date_format 参数的默认值将日期(to_date 函数的结果)转换为字符串,然后从该字符串计算 MD5 哈希。