Thursday, July 15, 2010

Using java class in PL/SQL function. Example: password encryption with SHA1

We can use java class in PL/SQL function in Oracle. Here is example of the java class which will accept string and it will encrypt string with SHA1 algorithm.

1. Create java file e.g SHA1Converter.java with below code:

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Encoder;

public class SHA1Converter

{

public static String SHA1(String text) throws NoSuchAlgorithmException,

UnsupportedEncodingException

{

MessageDigest md = MessageDigest.getInstance("SHA");

md.update(text.getBytes("UTF-8"));

byte raw[] = md.digest(); //step 4

String hash = (new BASE64Encoder()).encode(raw); //step 5

return "{SHA-1}"+hash;

}

}

2. Compile java file

javac SHA1Converter.java

3. Load compile class file using openjava command. Mention schema for which you want this java class to be made available

loadjava -u -schema -v -resolve SHA1Converter.class

password:

arguments: '-u' 'dgmt' '-schema' 'dgmt' '-v' '-resolve' 'SHA1Converter.class'

creating : class DGMT.SHA1Converter

loading : class DGMT.SHA1Converter

resolving: class DGMT.SHA1Converter

Classes Loaded: 1

Resources Loaded: 0

Sources Loaded: 0

Published Interfaces: 0

Classes generated: 0

Classes skipped: 0

Synonyms Created: 0

Errors: 0

4. Written function to use java class and return string encrypted using SHA1

create or replace

FUNCTION gnuhash_sha1 (string IN VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'SHA1Converter.SHA1(java.lang.String) return java.lang.String';

5. Use above function

select gnuhash_sha1('anand') from dual;

Result : {SHA-1}uXP3dL/qtTIztPNHvhFOnKey0A8=