Java生成の概要

7299 ワード

javaセキュリティクラスは、Java.security.MessageDigestクラスを提供しており、このMessage Digestクラスは、アプリケーションに情報要約アルゴリズムの機能を提供しています.例えば、MD 5またはSHA-1アルゴリズムです.情報の要約は、セキュリティの一方向ハッシュ関数であり、任意のサイズのデータを受信し、固定長のハッシュ値を出力する.MD 5の非常に実用的な応用性がある.説明参照:http://blog.csdn.net/Daping_Zhang/archive/2005/05/28/382688.aspxこのクラスのget Instance(String algorithm)方法は、Message Digestのエンティティに戻り、暗号化されたシステムのdigest()方法とudate(byte input)方法です.暗号化された後、byte[]に戻ります.16ビットの場合、多くのオープンソースのダウンロードアドレスに「md 5」のリンクがあります.開くとテキストの内容が短いです.例えば、MD 5(commons-loging-1.11-bin.zip)=f 88520 ed 6 c 4591 bc 058 b 55これはJakataのloggingコンポーネントのダウンロード時に提供されるMD 5要約情報であり、このzipパッケージを全文暗号化して生成する要約です.この二つの要約が同じなら、この書類は誰にも改竄されていないことを証明します.JavaのMessage Digest類は実行後に戻ってくるbyte[16]を16進の文字列に変換します.直接new String(byte[])を使うと、結果は正しくありません.まず次のように整理します
    public class MD5Builder {

    static Logger logger = Logger.getLogger(MD5Builder.class);
     //          16        
       static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
            '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 

      /**
     *        MD5  
     * @param file         
     * @return MD5   
     */
    public static String getMD5(File file) {
        FileInputStream fis = null;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");

            logger.info("MD5    :" + md.getDigestLength());
            fis = new FileInputStream(file);
            byte[] buffer = new byte[2048];
            int length = -1;
            logger.info("      ");
            long s = System.currentTimeMillis();
              while ((length = fis.read(buffer)) != -1) {
                md.update(buffer, 0, length);
            }
            logger.info("      ,   : "
                    + (System.currentTimeMillis() - s) + "ms");
            byte[] b = md.digest();
            return byteToHexString(b);
            // 16   
            // return buf.toString().substring(8, 24);
        } catch (Exception ex) {
            logger.error(ex);
            ex.printStackTrace();
            return null;
        }finally {
            try {
                fis.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

      /**
     *    String  MD5    
     * @param message     String
     * @return    MD5  
     */
    public static String getMD5(String message){
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            logger.info("MD5    :" + md.getDigestLength());
            byte[] b = md.digest(message.getBytes());
            return byteToHexString(b);
        } catch (NoSuchAlgorithmException e) {
            logger.error(e);
            e.printStackTrace();
            return null;
        }
    }

      /**
     *  byte[]                
     * @param tmp        byte[]
     * @return            
     */
    private static String byteToHexString(byte[] tmp) {
        String s;
        //         16    
        char str[] = new char[16 * 2]; //       16       ,      ,
        //       16      32    
        int k = 0; //               
        for (int i = 0; i < 16; i++) { //         ,  MD5       
            //     16        
            byte byte0 = tmp[i]; //    i    
            str[k++] = hexDigits[byte0 >>> 4 & 0xf]; //       4       , 
            // >>>      ,        
            str[k++] = hexDigits[byte0 & 0xf]; //       4       
        }
        s = new String(str); //            
        return s;
    }
}