<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    MD5加密

    MD5是Message Digest 5的縮寫,是一種加密算法,能夠?qū)ψ止?jié)數(shù)組進(jìn)行加密,有如下特點(diǎn):
    l???????? 不能根據(jù)加密后的信息找加密之前的信息;
    l???????? 加密后的結(jié)果是128位;
    l???????? 對于給定的字節(jié)數(shù)組,不管什么時(shí)候采用這種加密算法,結(jié)果是相同的;
    l???????? 對于不同的字節(jié)數(shù)組,加密的結(jié)果是不相同的。
    在Web應(yīng)用中通常需要對用戶設(shè)置的密碼進(jìn)行加密之后再存儲,否則數(shù)據(jù)庫管理員能夠看到明文的密碼,并且密碼也有被黑客獲取的危險(xiǎn)。
    可以使用MD5對用戶的密碼進(jìn)行加密。
    但是有兩種情況,你可能需要使用其他的方法處理:
    l???????? 需要保證密碼在傳輸過程中也是安全的,這時(shí)候通常都使用https,幾乎所有的銀行網(wǎng)站都是這樣,相對來說成本比較高。
    l???????? 如果網(wǎng)站提供了取回密碼的功能。因?yàn)槭褂肕D5加密之后原來的密碼是沒有辦法獲取的。
    MD5的應(yīng)用包括如下幾個(gè)過程:
    *??????? 把要加密的信息轉(zhuǎn)換成字節(jié)數(shù)組;
    *??????? 獲取MessageDigest對象,該對象完成加密;
    *???????? 使用轉(zhuǎn)換后的字節(jié)數(shù)組初始化MessgeDigest對象;
    *???????? 調(diào)用digest方法進(jìn)行加密,返回byte數(shù)組;
    *??????? 把byte數(shù)組轉(zhuǎn)換成字符串,然后就可以使用加密后的字符串了。
    假設(shè)原來的字符串為oldStr,內(nèi)容為“l(fā)ixucheng”,加密后的字符串為newStr。具體過程分別介紹如下。
    1、把字符串轉(zhuǎn)換成字節(jié)數(shù)組
    ??? 可以使用字符串的getBytes方法進(jìn)行轉(zhuǎn)換,例如:
    byte[] oldBytes = oldStr.getBytes();
    數(shù)組中的數(shù)據(jù):108 105 120 117 99 104 101 110 103
    2、獲取MessgaeDigest對象
    使用MessageDigest的getInstance(String str)方法得到MessgeDigest對象,參數(shù)使用MD5。例如:
    MessageDigest md = MessageDigest.getInstance("MD5");
    3、使用轉(zhuǎn)換后的字節(jié)數(shù)組初始化MessgeDigest對象
    使用update方法進(jìn)行初始化,參數(shù)為轉(zhuǎn)換后的字節(jié)數(shù)組。例如:
    md.update(oldBytes);
    4、調(diào)用digest方法進(jìn)行加密
    方法返回的是字節(jié)數(shù)組。例如:
    byte[] newBytes = md.digest();
    數(shù)組中的數(shù)據(jù)(16位):-22 1 35 121 -120 65 114 75 127 -34 31 -21 51 -37 -97 -118
    5、轉(zhuǎn)換成16進(jìn)制表示的字符串
    ??? 下面的代碼完成轉(zhuǎn)換:
    ??????????? // 構(gòu)造長度為2倍的字符串
    ???????????????????? char newStr[] = new char[32];
    ?
    ??????????????????????? // 循環(huán)進(jìn)行處理
    ???????????????????? for (int i = 0; i < 16; i++) {
    ??????????????????????????? byte tmp = newBytes[i];
    ??????????????????????????? newStr[2*i] = hexDigits[tmp >>> 4 & 0xf];
    ??????????????????????????? newStr[2*i+1] = hexDigits[tmp & 0xf];
    ???????????????????? }
    轉(zhuǎn)換后的字符串(32位):ea0123798841724b7fde1feb33db9f8a
    提示:如果需要把轉(zhuǎn)換后的密碼保存到數(shù)據(jù)庫中,需要使用的類型為:char(32)。


    完整的參考代碼如下:?

    ?
    import java.security.*;
    ?
    class MD5_Test {
    ?????? public final static String MD5(String oldStr) {
    ????????????? char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    ??????????????????????????? 'a', 'b', 'c', 'd', 'e', 'f' };
    ??????????????? System.out.println("原始字符串為:"+oldStr);
    ????????????? try {
    ??????????????????????? // 參數(shù)oldStr表示要加密的字符串
    ??????????????????????? // 轉(zhuǎn)換成字節(jié)流
    ???????????????????? byte[] oldBytes = oldStr.getBytes();
    ?
    for(byte b:oldBytes)
    {
    ???????????????????? System.out.print(b+" ");
    }
    System.out.println();
    ?
    ?
    ??????????????????????? // 得到對象
    ??????????????????????? MessageDigest md = MessageDigest.getInstance("MD5");
    ?
    ??????????????????????? // 初始化
    ???????????????????? md.update(oldBytes);
    ?
    ??????????????????????? // 運(yùn)行加密算法
    ???????????????????? byte[] newBytes = md.digest();
    ?
    for(byte b:newBytes)
    {
    ???????????????????? System.out.print(b+" ");
    }
    System.out.println();
    ?
    ??????????????????????? // 構(gòu)造長度為2倍的字符串
    ???????????????????? char newStr[] = new char[32];
    ?
    ??????????????????????? // 循環(huán)進(jìn)行處理
    ???????????????????? for (int i = 0; i < 16; i++) {
    ??????????????????????????? byte tmp = newBytes[i];
    ??????????????????????????? newStr[2*i] = hexDigits[tmp >>> 4 & 0xf];
    ??????????????????????????? newStr[2*i+1] = hexDigits[tmp & 0xf];
    ???????????????????? }
    ???????????????????? System.out.println(newStr);
    ???????????????????? return new String(newStr);
    ????????????? } catch (Exception e) {
    ???????????????????? return null;
    ????????????? }
    ?????? }
    ?
    ?????? public static void main(String[] args) {
    ????????????? System.out.println(MD5_Test.MD5("lixucheng"));
    ?????? }
    }
    文章出處:DIY部落(http://www.diybl.com/course/1_web/webjs/20071112/85782.html)

    posted on 2009-04-07 10:54 luofeng225 閱讀(170) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2009年4月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    我曾經(jīng)聽到這么一個(gè)故事: 一個(gè)年輕的程序員問一個(gè)老程序員(一個(gè)比較牛逼的公司的CTO) 年輕程序員: 你為什么這么牛X., 就好像沒有你不會的。老程序員: 積累的。年輕程序員: 怎么才能積累到您的程度呢。我每天都在積累。但是似乎都沒有感覺到進(jìn)步。老程序員: 我從20歲開始做到了一件事情,直到今天,而且盡可能地保證不間斷。年輕程序員: 到底是什么? 老程序員: 我每天保證自己有2個(gè)小時(shí)在學(xué)習(xí)新的東西。

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    收藏夾

    Java Website

    java技術(shù)博客

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一本岛高清v不卡免费一三区| 本免费AV无码专区一区| 99在线精品免费视频九九视| 亚洲国产精品lv| 特级无码毛片免费视频尤物| 久久久久亚洲Av无码专| 色欲国产麻豆一精品一AV一免费| 亚洲AV无码一区二区乱子伦| 日本高清免费观看| 久久夜色精品国产噜噜亚洲AV| 久久精品视频免费播放| 亚洲老熟女@TubeumTV| 色se01短视频永久免费| 亚洲欧洲精品成人久久曰| 日韩免费a级在线观看| 国产成人+综合亚洲+天堂| 亚洲精品视频在线看| 国产自国产自愉自愉免费24区| 亚洲一区二区电影| 成人免费无码大片a毛片| 看全免费的一级毛片| 亚洲色偷偷偷鲁综合| 亚州免费一级毛片| 亚洲妇女无套内射精| 亚洲国产成人久久综合一区77 | 亚洲av永久中文无码精品| 午夜视频在线观看免费完整版| 美女又黄又免费的视频| 亚洲毛片αv无线播放一区| 100部毛片免费全部播放完整| 亚洲精品动漫免费二区| 久久久无码精品亚洲日韩软件| 久久这里只精品99re免费| 亚洲人成电影网站色| 亚洲日产无码中文字幕| 丁香花免费高清视频完整版| 成人免费网站久久久| 亚洲美女视频网址| 国产亚洲精品成人a v小说| 114一级毛片免费| 国产成人无码免费网站|