/**
* Copyright (c) 2005-2010 springside.org.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
*
* $Id: DigestUtils.java 799 2009-12-31 15:34:10Z calvinxiu $
*/
package org.springside.modules.security.utils;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import org.springside.modules.utils.encode.EncodeUtils;
/**
* 支持SHA-1/MD5消息摘要的工具类.
*
* 支持Hex与Base64两种编码方式.
*
* @author calvin
*/
public class DigestUtils {
private static final String SHA1 = "SHA-1";
private static final String MD5 = "MD5";
//-- String Hash function --//
/**
* 对输入字符串进行sha1散列, 返回Hex编码的结果.
*/
public static String sha1ToHex(String input) {
byte[] digestResult = digest(input, SHA1);
return EncodeUtils.hexEncode(digestResult);
}
/**
* 对输入字符串进行sha1散列, 返回Base64编码的结果.
*/
public static String sha1ToBase64(String input) {
byte[] digestResult = digest(input, SHA1);
return EncodeUtils.base64Encode(digestResult);
}
/**
* 对输入字符串进行sha1散列, 返回Base64编码的URL安全的结果.
*/
public static String sha1ToBase64UrlSafe(String input) {
byte[] digestResult = digest(input, SHA1);
return EncodeUtils.base64UrlSafeEncode(digestResult);
}
/**
* 对字符串进行散列, 支持md5与sha1算法.
*/
private static byte[] digest(String input, String algorithm) {
try {
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
return messageDigest.digest(input.getBytes());
} catch (GeneralSecurityException e) {
throw new IllegalStateException("Security exception", e);
}
}
//-- File Hash function --//
/**
* 对文件进行md5散列,返回Hex编码结果.
*/
public static String md5ToHex(InputStream input) throws IOException {
return digest(input, MD5);
}
/**
* 对文件进行sha1散列,返回Hex编码结果.
*/
public static String sha1ToHex(InputStream input) throws IOException {
return digest(input, SHA1);
}
/**
* 对文件进行散列, 支持md5与sha1算法.
*/
private static String digest(InputStream input, String algorithm) throws IOException {
try {
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
int bufferLength = 1024;
byte[] buffer = new byte[bufferLength];
int read = input.read(buffer, 0, bufferLength);
while (read > -1) {
messageDigest.update(buffer, 0, read);
read = input.read(buffer, 0, bufferLength);
}
return EncodeUtils.hexEncode(messageDigest.digest());
} catch (GeneralSecurityException e) {
throw new IllegalStateException("Security exception", e);
}
}
}