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

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

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

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    電子商務使用數據加密來保護數據庫 (二)

    電子商務使用數據加密來保護數據庫?(二)
    上篇講解了一些理論上的內容,這次我們詳細介紹一下例子:

    例如,我們創建一個類DESUtil.java

    按照上次講的,我要首先要創建一個密鑰,所以先增加一個方法,用來創建DES密鑰。為了使用方便,我們暫時把所有的方法寫成靜態方法。
    //filename是要保存的文件路徑
    public?static?void?createKey(String?filename)?throws?Exception{
    //生成一個可信任的隨機數源
    SecureRandom?sr?=?new?SecureRandom();
    //為我們選擇的DES算法生成一個KeyGenerator對象
    KeyGenerator?kg?=?KeyGenerator.getInstance("DES");
    kg.init(sr);
    //生成密鑰
    Key?key?=?kg.generateKey();
    //將密鑰數據保存為文件供以后使用
    writeFile(key,filename); //稍候講解
    }

    好了,我們可以通過上面的方法生成密鑰了。
    因為我們可能會在不同的地方調用加密或者解密的方法,所以我們必須把生成密鑰的存儲在一個文件中,推薦存儲到應用的/WEB-INF/的某個目錄下,因為那個目錄只由自己的程序調用,不能通過URL訪問,所以更安全。接下來我們要寫兩個方法,一個將密鑰存儲到文件,另一個則是在加密或者解密的方法中讀出密鑰進行加密或者解密。

    //filename是密鑰存儲的路徑,msg是我們用第一個方法生成的密鑰
    public?static?void?writeFile(Key?msg,?String?filePath)?{
    try?{
    File?file?=?new?File(filePath);
    if?(file.exists())?{
    file.delete();
    }
    FileOutputStream?wf?=?new?FileOutputStream(file);
    ObjectOutputStream?out?=?new?ObjectOutputStream(wf);
    out.writeObject(msg);
    out.close();
    file?=?null;
    wf?=?null;
    }?catch?(IOException?e)?{
    debug(e.getMessage());
    }
    }
    //filename是密鑰存儲的路徑
    public?static?Key?readFile(String?filePath)?{
    Key?key?=?null;
    try?{
    File?f?=?new?File(filePath);
    if?(f.exists())?{
    FileInputStream?bw?=?new?FileInputStream(f);
    ObjectInputStream?in?=?new?ObjectInputStream(bw);
    key?=?(Key)in.readObject();
    in.close();
    bw?=?null;
    }
    f?=?null;
    }?catch?(Exception?e)?{
    debug(e.getMessage());
    }
    return?key;
    }

    這里我們直接把密鑰對象整個存到了文件中,當然也可以用字節的方式存儲,但是中間可以會有些小麻煩噢!

    好了,現在密鑰的問題也解決了,我們接下來的工作就是寫加密和解決的方法了。

    //str?要加密的字節數組
    public?static?byte[]?DataEncrypt(byte[]?str,String?filename)?throws?Exception{
    //
    SecretKey?key?=?(SecretKey)readFile(filename);
    //Cipher對象實際完成加密操作
    Cipher?cipher?=?Cipher.getInstance("DES");
    //用密鑰初始化Cipher對象
    cipher.init(Cipher.ENCRYPT_MODE,?key);
    //執行加密操作
    byte[]?encryptedData?=?cipher.doFinal(str);
    //
    return?encryptedData;
    }
    //str?要解密的字節數組
    public?static?byte[]?DataDecrypt(byte[]?str,String?filename)?throws?Exception{
    //
    SecretKey?key?=?(SecretKey)readFile(filename);
    //Cipher對象實際完成加密操作
    Cipher?cipher?=?Cipher.getInstance("DES");
    //用密鑰初始化Cipher對象
    cipher.init(Cipher.DECRYPT_MODE,?key);
    //執行加密操作
    byte[]?encryptedData?=?cipher.doFinal(str);
    //
    return?encryptedData;
    }


    簡單吧,我們已經成功的創建了DES加密,解密的類了。測試一下吧!

    public?static?void?main(String[]?args)?{
    String?filename?=?"c:/des.key";
    String?str?=?"0109103746028";
    System.out.print("source="+str);
    try?{
    DESUtil.createKey(filename);
    //
    byte[]?enstr?=?DESUtil.DataEncrypt(str.getBytes(),filename);
    str?=?new?String(enstr);//加密后的字串
    System.out.print("encrypt="?+?str);
    //
    byte[]?destr?=?DESUtil.DataDecrypt(str.getBytes(),filename);
    str?=?new?String(destr);//解密后的字串
    System.out.print("decrypt="?+?str);
    }?catch?(Exception?e)?{
    e.printStackTrace();
    }
    debug("ok");
    }

    如果沒有定錯的話,一定報錯了:?javax.crypto.BadPaddingException:?Given?final?block?not?properly?padded
    怎么回事,都是按照你的寫的,怎么會不對呢?仔細分析一下,不難發現,該異常是在解密的時候拋出的,加密的方法沒有問題。

    但是兩個方法的唯一差別是Cipher對象的模式不一樣,這就排除了程序寫錯的可能性。再看一下異常的揭示信息,大概的意思是:提供的字塊不符合填補的。什么意思???原來在用DES加密的時候,最后一位長度不足64的,它會自動填補到64,那么在我們進行字節數組到字串的轉化過程中,可以把它填補的不可見字符改變了,所以引發系統拋出異常。問題找到,怎么解決呢?大家還記得郵件傳輸通常會把一些信息編碼保存,對了,就是Base64,那樣保證了信息的完整性,所以我們就是利用一下下了。為了方便使用,我們再寫一個新的方法封裝一下原來的方法:
    //
    public?static?String?DataEncrypt(String?str){
    String?encrypt?=?null;
    try{
    byte[]?ret?=?DataEncrypt(str.getBytes("UTF-8"),filename);
    encrypt?=?new?String(Base64.encode(ret),"UTF-8");
    }catch(Exception?e){
    System.out.print(e);
    encrypt?=?str;
    }
    return?encrypt;
    }
    //
    public?static?String?DataDecrypt(String?str){
    String?decrypt?=?null;
    try{
    byte[]?ret?=??DataDecrypt(Base64.decode(str.getBytes("UTF-8")),filename);
    decrypt?=??new?String(ret,"UTF-8");
    }catch(Exception?e){
    System.out.print(e);
    decrypt?=?str;
    }
    return?decrypt;
    }

    我們把方法的參數改成了字串,但是為什么要用UTF-8呢?不指定它的字節格式不行嗎?大家知道,UTF-8是國際通用的字符編碼,用它傳輸任何字串都不會有問題,通過它也可以很完美的解決J2EE的中文問題!所以我們最好用UTF-8編碼,以減少不必要的麻煩。

    注意,上面方法中當加密或者解密過程中,程序拋出異常,將返回原值,使得在調用方法失敗時更方便的找出錯誤。

    大家也可以利用其它的密鑰,進行不同地方的加密解埽?

    總結:DES是一個相對比較老的加密算法,對于現在也不是最安全的,所以大家也可以利用別的加密算法進行加密解密,以得到更安全的系統。

    附:
    DESUtil.java及Base64.java的源文件

    posted on 2006-12-16 12:07 都市淘沙者 閱讀(327) 評論(0)  編輯  收藏 所屬分類: 加密解密/其他分類

    主站蜘蛛池模板: 亚洲av无码偷拍在线观看| www免费插插视频| 国产成人亚洲精品狼色在线| 97人伦色伦成人免费视频| 久久精品免费观看| 美景之屋4在线未删减免费 | 亚洲国产精品日韩在线观看 | 污污免费在线观看| 亚洲综合一区无码精品| 亚洲成AV人片在线播放无码| 免费看一级做a爰片久久| 美女视频黄是免费的网址| 中文字幕免费不卡二区| 九九免费观看全部免费视频| 亚洲第一街区偷拍街拍| 亚洲一区二区三区91| 国产A在亚洲线播放| 亚洲日韩VA无码中文字幕| 国产精品无码免费视频二三区| 日本免费网址大全在线观看| 暖暖免费在线中文日本| 四虎国产精品成人免费久久| 亚洲日本VA中文字幕久久道具| 亚洲中文无码a∨在线观看| 亚洲欧洲日韩在线电影| 亚洲大成色www永久网站| 久久久久亚洲精品无码网址| 亚洲AⅤ无码一区二区三区在线| 免费欧洲美女牲交视频| 九九九精品成人免费视频| 无码日韩精品一区二区免费 | 亚洲日产2021三区| 亚洲明星合成图综合区在线| 思思re热免费精品视频66| 亚洲神级电影国语版| 性色午夜视频免费男人的天堂| 色多多A级毛片免费看| 国产精品久久免费视频| 国产AV无码专区亚洲AV蜜芽| 在线观看免费精品国产| 久久亚洲色WWW成人欧美|