ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>91九色视频在线,国产成人精品av,777a∨成人精品桃花网http://www.aygfsteel.com/nighty/category/31358.htmlzh-cnThu, 08 May 2008 08:17:27 GMTThu, 08 May 2008 08:17:27 GMT60Java MD5加密生成摘要http://www.aygfsteel.com/nighty/archive/2008/05/08/199246.html寒武¾U?/dc:creator>寒武¾U?/author>Thu, 08 May 2008 07:02:00 GMThttp://www.aygfsteel.com/nighty/archive/2008/05/08/199246.htmlhttp://www.aygfsteel.com/nighty/comments/199246.htmlhttp://www.aygfsteel.com/nighty/archive/2008/05/08/199246.html#Feedback0http://www.aygfsteel.com/nighty/comments/commentRss/199246.htmlhttp://www.aygfsteel.com/nighty/services/trackbacks/199246.html    åˆšå¥½æœ€˜q‘项目中需要用åˆîC¸€ç‚¹åŠ å¯†çš„ä¸œè¥¿åQŒjava安全¾cÕdº“提供了一ä¸?strong>java.security.MessageDigest¾c»ï¼Œæ­?MessageDigest ¾cÖMؓ应用½E‹åºæä¾›ä¿¡æ¯æ‘˜è¦½Ž—法的功能,å¦?MD5 æˆ?SHA ½Ž—法。信息摘要是安全的单向哈希函敎ͼŒå®ƒæŽ¥æ”¶ä“Q意大ž®çš„æ•°æ®åQŒåƈ输出固定长度的哈希倹{€‚有现成的当然是最好的åQŒçœäº‹çœåŠ›ã€?br />     MD5的非常有实际应用性。有¾|‘友¾l™å‡º˜q™æ ·çš„æ˜qŽÍ¼Œå¯ä»¥å‚照一下:http://blog.csdn.net/Daping_Zhang/archive/2005/05/28/382688.aspx
     è¯¥ç±»çš?code>getInstance(String algorithm) æ–ÒŽ³•˜q”回一个MessageDigest的实体,加密的一¾pȝ»Ÿçš?code>digest()æ–ÒŽ³•å’?code>update(byte input)æ–ÒŽ³•。加密后˜q”回一个byte[]åQ?6位,我们¾lå¸¸è§åˆ°å¾ˆå¤šå¼€æºç½‘站的下蝲地址会有一个[md5]的链接,打开其实ž®±æ˜¯ä¸€ž®æ®µæ–‡æœ¬å†…容。例如:
    MD5 (commons-logging-1.1.1-bin.zip) = f88520ed791673aed6cc4591bc058b55
    ˜q™æ˜¯Jakartaçš„logging¾l„äšg下蝲时提供的MD5摘要信息åQŒæ˜¯å¯¹è¿™ä¸ªzip包进行全文加密生成的摘要åQŒæ‘˜è¦ç ž®±æ˜¯åŽé¢çš„f88520ed791673aed6cc4591bc058b55åQŒå¦‚果你下蝲以后åQŒæŒ‰ç…§MD5的算法生成自å·Þqš„æ‘˜è¦åQŒå¦‚æžœè¿™äºŒä¸ªæ‘˜è¦ä¸€æ øP¼Œž®Þp¯æ˜Žè¿™ä¸ªæ–‡ä»¶æ˜¯æ²¡æœ‰è¢«äh½‹¡æ”¹˜q‡çš„ã€?br />     é‡åˆ°çš„问题是Javaçš„MessageDigest¾cÀL‰§è¡ŒåŽ˜q”回的byte[16]å¾—è{换成十六˜q›åˆ¶çš„å­—½W¦ä¸²åQŒå¦‚果直接用new String(byte[])åQŒå¾—到的¾l“æžœž®†æ˜¯ä¸æ­£¼‹®çš„。算法有很多¾|‘友提供了,照搬了。比较有­‘£çš„æ˜¯ï¼Œcommons-logging提供的那个MD5居然和我自己生成的不一æ ?éšùN“æ–‡äšg被修改过åQ?åQŒåŽæ¥å°è¯•了其它地方提供的MD5码,都没有问题ã€?br />     æœ‰å¾ˆå¤šç›¸å…³çš„现成代码åQŒæœé›†äº†ä¸€ä¸‹æ•´ç†å¦‚下(¾lè¿‡éªŒè¯åQ‰ï¼š

public class MD5Builder {

    
static Logger logger = Logger.getLogger(MD5Builder.class);
     
// ç”¨æ¥ž®†å­—节è{换成 16 ˜q›åˆ¶è¡¨ç¤ºçš„å­—½W?/span>
    static char hexDigits[] = '0''1''2''3''4''5''6''7''8',
            
'9''a''b''c''d''e''f' }

    
    
/**
     * å¯ÒŽ–‡ä»¶å…¨æ–‡ç”ŸæˆMD5摘要
     * 
@param file   è¦åŠ å¯†çš„æ–‡äšg
     * 
@return MD5摘要ç ?br />      */

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

            logger.info(
"MD5摘要长度åQ?/span>" + md.getDigestLength());
            fis 
= new FileInputStream(file);
            
byte[] buffer = new byte[2048];
            
int length = -1;
            logger.info(
"开始生成摘�/span>");
            
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位加å¯?br />             // 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();
            }

        }

    }


    
/**
     * å¯¹ä¸€ŒDµString生成MD5加密信息
     * 
@param message è¦åŠ å¯†çš„String
     * 
@return ç”Ÿæˆçš„MD5信息
     
*/

    
public static String getMD5(String message){
        
try {
            MessageDigest md 
= MessageDigest.getInstance("MD5");
            logger.info(
"MD5摘要长度åQ?/span>" + md.getDigestLength());
            
byte[] b = md.digest(message.getBytes());
            
return byteToHexString(b);
        }
 catch (NoSuchAlgorithmException e) {
            logger.error(e);
            e.printStackTrace();
            
return null;
        }

    }

    
    
/**
     * æŠŠbyte[]数组转换成十六进制字½W¦ä¸²è¡¨ç¤ºå½¢å¼
     * 
@param tmp    è¦è{换的byte[]
     * 
@return åå…­˜q›åˆ¶å­—符串表½CºåÅžå¼?br />      */

    
private static String byteToHexString(byte[] tmp) {
        String s;
        
// ç”¨å­—节表½Cºå°±æ˜?nbsp;16 ä¸ªå­—èŠ?/span>
        char str[] = new char[16 * 2]; // æ¯ä¸ªå­—节ç”?nbsp;16 ˜q›åˆ¶è¡¨ç¤ºçš„话åQŒä‹É用两个字½W¦ï¼Œ
        
// æ‰€ä»¥è¡¨½Cºæˆ 16 ˜q›åˆ¶éœ€è¦?nbsp;32 ä¸ªå­—½W?/span>
        int k = 0// è¡¨ç¤ºè½¬æ¢¾l“果中对应的字符位置
        for (int i = 0; i < 16; i++// ä»Žç¬¬ä¸€ä¸ªå­—节开始,å¯?nbsp;MD5 çš„æ¯ä¸€ä¸ªå­—èŠ?br />             // è½¬æ¢æˆ?nbsp;16 ˜q›åˆ¶å­—符的è{æ?/span>
            byte byte0 = tmp[i]; // å–第 i ä¸ªå­—èŠ?/span>
            str[k++= hexDigits[byte0 >>> 4 & 0xf]; // å–字节中é«?nbsp;4 ä½çš„æ•°å­—转换, 
            
// >>> ä¸ºé€»è¾‘右移åQŒå°†½W¦å·ä½ä¸€èµ·å³¿U?/span>
            str[k++= hexDigits[byte0 & 0xf]; // å–字节中ä½?nbsp;4 ä½çš„æ•°å­—转换
        }

        s 
= new String(str); // æ¢åŽçš„结果è{æ¢äØ“å­—ç¬¦ä¸?/span>
        return s;
    }

}

  



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ºÍË¶ÏØ| Ç­ÄÏ| ãþ´¨ÏØ| ÈÀÌÁÏØ| Áú´¨ÏØ| Èý½­| À¼¿¼ÏØ| ·ïɽÊÐ| ·ÚÎ÷ÏØ| Î÷»ªÏØ| ÂéÀõÆÂÏØ| ÇßÔ´ÏØ| ·áÕòÊÐ| ¶ë±ß| ÖÛɽÊÐ| »´±õÏØ| äü¹ØÏØ| ÐÂÖñÏØ| ͳ·¬ÊÐ| °Ý³ÇÏØ| °²¿µÊÐ| ʯ×ìɽÊÐ| ÓÜÖÐÏØ| ¹«°²ÏØ| ¸ß±®µêÊÐ| ºÍÆ½Çø| Äϵ¤ÏØ| ÂåÄþÏØ| ººÒõÏØ| ¦µ×ÊÐ| ׯºÓÊÐ| ºªµ¦ÏØ| ¹¢Âí| иÉÏØ| ÔÆ¸¡ÊÐ| ¹óµÂÏØ| ¸»Ô£ÏØ| Àû½òÏØ| ƽ¶¥É½ÊÐ| ´Ó»¯ÊÐ| Ò˶¼ÊÐ|