ï»??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 GMT60- Java 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;
}
}

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