【问题标题】:How can I get md5 sum from date in JAVA such in oracle?如何在 Oracle 等 JAVA 中从日期获取 md5 总和?
【发布时间】: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 哈希。

标签: java oracle md5


【解决方案1】:

在您上面的评论中,您说 Oracle 中使用的确切表达式是:

DBMS_CRYPTO.hash( UTL_RAW.CAST_TO_RAW( UPPER(to_date('01.02.1980', 'dd.mm.yyyy')) ),2 )

因此,您获取字符串“01.02.1980”并使用适当的格式将其转换为DATE。然后将结果传递给UPPER();这将导致 DATE 使用会话的默认日期格式隐式转换为字符串。所以这个表达式如果在不同的环境中执行,结果可能会有所不同。

要尝试在 Java 中重现相同的哈希值,请使用 NLS_DATE_FORMAT 实例参数指示的日期格式。但它可能适用于某些条目而不适用于其他条目,因为使用的日期格式可能会有所不同。

基本上,您在创建和存储这些哈希值的 Oracle 代码中存在一个非常严重的错误。将日期隐式转换为字符串可能很危险。

【讨论】:

  • 感谢您的回答。我会试着在星期一检查一下。
  • 非常感谢。 Oracle 格式为 01.02.1980 00:00:00 我们将在进行散列之前将 oracle 和 java 部分中的日期转换为一种格式,以便将来排除此类问题
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
相关资源
最近更新 更多