SHA-1 Hashing in Oracle Database 10g

As mentioned earlier, the MD5 protocol is not considered sufficiently secure for modern data protection, and SHA-1 is often used instead. SHA-1 is not available in the DBMS_OBFUSCATION_TOOLKIT, but in Oracle Database 10g, you can use the HASH function available in the DBMS_CRYPTO package to perform SHA-1 hashing . Here is the declaration of the function:

    DBMS_CRYPTO.hash (
       src in raw,
       typ in pls_integer)
     return raw;

Because HASH accepts only the RAW datatype as input, I have to convert the input character string to RAW using the technique described earlier for encryption.

    l_in := utl_i18n.string_to_raw (p_in_val, 'AL32UTF8');

This converted string can now be passed to the hash function.

In the second parameter typ (which must be declared in the PLS_INTEGER datatype ) you specify the algorithm to use for hashing. You can select any of the algorithms in Table 4-7.

Table 4-7. Hashing algorithms in DBMS_CRYPTO

Constant

Description

DBMS_CRYPTO.HASH_MD5

Message Digest 5

DBMS_CRYPTO.HASH_MD4

Message Digest 4

DBMS_CRYPTO.HASH_SH1

Secure Hashing Algorithm 1

For example, to get the hash value for a RAW datatype variable, you might write a function as follows:

    /* File on web: get_sha1_hash_val.sql */

    CREATE OR REPLACE FUNCTION get_sha1_hash_val (p_in RAW)
       RETURN RAW
    IS
       l_hash   RAW (4000);
    BEGIN
       l_hash := DBMS_CRYPTO.HASH (src => p_in, typ => DBMS_CRYPTO.hash_sh1);
       RETURN l_hash;
    END;
    /

For MD5 hashing, you would change the value of the parameter typ ...

Get Oracle PL/SQL for DBAs now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.