Как я могу получить сумму MD5 от даты в JAVA, такие в оракуле? - PullRequest
2 голосов
/ 08 июля 2011

У меня следующая проблема. В базе данных дата хранится как md5 от даты. Когда я делаю md5 с той же даты в JAVA, у меня был еще один хэш. Например: дата - 01.02.1980 хеш java - это addaf0f9a1fb3699871293f888f6e46e (такой же, как хэш oracle md5 из строки) хэш оракула - DF0919EA828A77DC2CCF68474ED703AC

Я пытался повторить результат оракула в Java:

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);
    }
}

и вывод отличается, но только до тех пор, пока байт [] не преобразуется в 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

Есть ли какие-нибудь возможности сделать хэш md5 такой как в oracle?

1 Ответ

2 голосов
/ 08 июля 2011

В своем комментарии выше вы говорите, что точное выражение, используемое в 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, который создал и сохранил эти значения хеш-функции.Неявное преобразование даты в строку может быть опасным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...