Showing posts with label apache commons. Show all posts
Showing posts with label apache commons. Show all posts

Tuesday, January 15, 2013

计算 HMAC

如何使用 Java 计算数字签名。
import javax.crypto.KeyGenerator ;
import javax.crypto.Mac ;
import javax.crypto.SecretKey ;
import javax.crypto.spec.SecretKeySpec ;

import java.security.NoSuchAlgorithmException ;
import java.security.InvalidKeyException ;

import org.apache.commons.codec.binary.Base64 ;

public class TestHMAC {
    SecretKey key ;
    Mac mac ;

    public String getKey () {
 byte[] bin = key.getEncoded () ;
 byte[] ascii = Base64.encodeBase64 (bin) ;
 return new String (ascii) ;
    }

    public TestHMAC (String alg)
 throws NoSuchAlgorithmException, InvalidKeyException {
 KeyGenerator gen = KeyGenerator.getInstance (alg) ;
 key = gen.generateKey () ;
 mac = Mac.getInstance (key.getAlgorithm ()) ;
 mac.init (key) ;
    }

    public TestHMAC (String alg, String k)
 throws NoSuchAlgorithmException, InvalidKeyException {
 byte [] ascii = k.getBytes () ;
 byte [] c = Base64.decodeBase64 (k) ;
 key = new SecretKeySpec (c, alg) ;
 mac = Mac.getInstance (key.getAlgorithm ()) ;
 mac.init (key) ;
    }

    public byte[] hash (Object o) {
 byte[] c = o.toString ().getBytes () ;
 return mac.doFinal (c) ;
    }

    public String hashToAscii (Object o) {
 byte [] hash = hash (o) ;
 byte [] ascii = Base64.encodeBase64 (hash) ;
 return new String (ascii) ;
    }

}

Sunday, August 22, 2010

Java 中的日志解决方案

Java 里面有一些现成的 logging 库,比如 log4j(apache logging 的子项目),JDK 里面自带的 java.util.logging,以及 jakarta commons 里面的 logging 库 。这样也就诞生了很多 wrapper,或者用 design pattern 的话来说所谓 facade 的东西,比如 org.apache.commons.logging 和 org.slf4j。这两个使用比较容易,一般提供了一个 factory 用于获得 logger(前者为 LogFactory.getLog(),后者为 LoggerFactory.getLogger())。

下面用一个简单的例子说明如何使用 org.apache.commons.logging。
import org.apache.commons.logging.Log ;
import org.apache.commons.logging.LogFactory ;

private Log log = LogFactory.getLog( MyClass.class ) ;
if( log.isFatalEnabled() ) 
    log.fatal( "this is a fatal error message") ;

import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ; 

Logger log = LoggerFactory.getLogger( MyClass.class ) ;
log.debug( "something in {} is {}", something, val) ;
类似的还有 info、warn、error、trace 用在不同的情况。

后者提供了几个 hard-wired 的库,如 slf4j-nop(无输出)、slf4j-jdk(使用 java.util.logging)、slf4j-log4j(使用 log4j)、slf4j-simple(使用 System.err)、slf4j-jcl(使用 jakarta commons logging)。通过改变 -cp 就能方便的使用不同的 logger。

值得一提的是在 apache 的 logging 里面不仅仅有 java 的,还有 C++、.net 和 php 的 logger。