본문 바로가기

Programming/Java

Java 로 구현한 SHA-1 hash 암호화 알고리즘

Java 프로그램에서 SHA-1 hash 암호화 알고리즘을 사용하는 모듈이 필요하여 작성하였다.


import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/*
 * SHA is a cryptographic message digest algorithm similar to MD5. 
 * SHA-1 hash considered to be one of the most secure hashing functions, 
 * producing a 160-bit digest (40 hex numbers) from any data with a maximum size of 264 bits. 
 * While Java has built in classes to compute SHA 1 hash, 
 * it's quite uneasy to use them for a simple task 
 * -- calculate SHA-1 hash and return 40 byte hexadecimal string.
 * 
 *  Compatibility: compatible with Sun Java 1.4 or higher.
 */
public class SimpleSHA1 
{
 // 아래 코드는 버퍼의 크기가 문자열의 크기만큼 되어서 효율적이지 않다.
 // 보다 좋은 성능을 내기 위해서는 buffer size 를 정해서 작성할 필요가 있다. (i.e. 1025 bytes)
 private static String convertToHex(byte[] data) 
 {
  StringBuffer buf = new StringBuffer();
  
  for (int i = 0; i < data.length; i++) 
  {
   int halfbyte = (data[i] >>> 4) & 0x0F;
   int two_halfs = 0;
   
   do 
   {
    if ((0 <= halfbyte) && (halfbyte <= 9))
     buf.append((char) ('0' + halfbyte));
    else
     buf.append((char) ('a' + (halfbyte - 10)));
     halfbyte = data[i] & 0x0F;
   } while(two_halfs++ < 1);
   }
  return buf.toString();
 }
 
 // 아래의 코드는 단순히 문자열을 SHA1 해쉬 값을 구해주는 코드이다.
 public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException  
 {
  MessageDigest md;
  md = MessageDigest.getInstance("SHA-1");
  byte[] sha1hash = new byte[40];
  
  md.update(text.getBytes("iso-8859-1"), 0, text.length());
  sha1hash = md.digest();
  return convertToHex(sha1hash);
 }
 
 public static void main(String [] args)
 {
  String test = "This is a test message to be digested. gulping.... gulping.... grunting.... belching.....";
  
  try
  {
   System.out.println("Digested message by SHA1:" + SimpleSHA1.SHA1(test));
  }
  catch(Exception e){}
 }
}