Java安全編程:基于口令加密(PBE)

安全 PBE

  • 在之前的文章中曾講到過DES加密算法无拗,類似這種加密算法都有一個(gè)密鑰梁只,密鑰的長(zhǎng)度決定了加密的安全性挫鸽,但是這種密鑰比較難記憶说敏,是需要存儲(chǔ)的。
  • PBE算法是一種基于口令的加密算法丢郊,它并不是構(gòu)建了一種新的加解密算法盔沫,而是對(duì)比如DES這樣的算法進(jìn)行了包裝医咨,采用隨機(jī)數(shù)加口令的方式保證數(shù)據(jù)的安全。
  • 在PBE算法中有口令一說架诞,相當(dāng)于我們記憶的密碼拟淮,但是口令的長(zhǎng)度以及安全性是有限的,所以這時(shí)需要采用隨機(jī)數(shù)附加在口令上通過消息摘要算法經(jīng)過迭代產(chǎn)生密鑰谴忧。
  • 使破譯的難度加大很泊。常用的PBE算法有PBEWITHMD5andDES。
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import junit.framework.TestCase;

public class PBETest extends TestCase {
    
    /** 算法 */
    public static final String ALGORITHM = "PBEWITHMD5andDES";
    /** 迭代次數(shù) */
    public static int ITERAT_COUNT = 100;

    /**
     * 構(gòu)造一個(gè)8位的鹽
     * @return
     */
    private byte[] initSalt() {
        SecureRandom random = new SecureRandom();
        return random.generateSeed(8);
    }
    
    /**
     * 生成口令的Key
     * @param password
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     */
    private Key getKey(String password) throws NoSuchAlgorithmException, InvalidKeySpecException {
        PBEKeySpec spec = new PBEKeySpec(password.toCharArray());
        SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
        return factory.generateSecret(spec);
    }
    
    /**
     * 加密
     * @param password
     * @param salt
     * @param data
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     * @throws NoSuchPaddingException
     * @throws InvalidKeyException
     * @throws InvalidAlgorithmParameterException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     */
    public byte[] encript(String password, byte[] salt, byte[] data) 
            throws NoSuchAlgorithmException, InvalidKeySpecException, 
            NoSuchPaddingException, InvalidKeyException,  BadPaddingException, 
            InvalidAlgorithmParameterException, IllegalBlockSizeException {
        Key key  = this.getKey(password);
        //實(shí)例化PBE參數(shù)材料
        PBEParameterSpec params = new PBEParameterSpec(salt, ITERAT_COUNT);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key, params);
        return cipher.doFinal(data);
    }
    
    /**
     * 解密
     * @param password
     * @param salt
     * @param data
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     * @throws NoSuchPaddingException
     * @throws InvalidKeyException
     * @throws InvalidAlgorithmParameterException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     */
    public byte[] decript(String password, byte[] salt, byte[] data)
            throws NoSuchAlgorithmException, InvalidKeySpecException, 
            NoSuchPaddingException, InvalidKeyException, BadPaddingException, 
            InvalidAlgorithmParameterException, IllegalBlockSizeException {
        Key key  = this.getKey(password);
        //實(shí)例化PBE參數(shù)材料
        PBEParameterSpec params = new PBEParameterSpec(salt, ITERAT_COUNT);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key, params);
        return cipher.doFinal(data);
    }
    
    public void test() throws Exception{
        String data = "需要處理的數(shù)據(jù)";
        String password = "123456";
        byte[] salt = this.initSalt();
        byte[] cryptograph = this.encript(password, salt, data.getBytes("GBK"));
        byte[] newData = this.decript(password, salt, cryptograph);
        
        System.out.println(data);
        System.out.println(Arrays.toString(cryptograph));
        System.out.println(new String(newData, "GBK"));
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沾谓,一起剝皮案震驚了整個(gè)濱河市委造,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌均驶,老刑警劉巖昏兆,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妇穴,居然都是意外死亡爬虱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門腾它,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饮潦,“玉大人,你說我怎么就攤上這事携狭〖汤” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵逛腿,是天一觀的道長(zhǎng)稀并。 經(jīng)常有香客問我,道長(zhǎng)单默,這世上最難降的妖魔是什么碘举? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮搁廓,結(jié)果婚禮上引颈,老公的妹妹穿的比我還像新娘。我一直安慰自己境蜕,他們只是感情好蝙场,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粱年,像睡著了一般售滤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天完箩,我揣著相機(jī)與錄音赐俗,去河邊找鬼。 笑死弊知,一個(gè)胖子當(dāng)著我的面吹牛阻逮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秩彤,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼叔扼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了呐舔?” 一聲冷哼從身側(cè)響起币励,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤慷蠕,失蹤者是張志新(化名)和其女友劉穎珊拼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體流炕,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澎现,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了每辟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剑辫。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渠欺,靈堂內(nèi)的尸體忽然破棺而出妹蔽,到底是詐尸還是另有隱情,我是刑警寧澤挠将,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布胳岂,位于F島的核電站,受9級(jí)特大地震影響舔稀,放射性物質(zhì)發(fā)生泄漏乳丰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一内贮、第九天 我趴在偏房一處隱蔽的房頂上張望产园。 院中可真熱鬧,春花似錦夜郁、人聲如沸什燕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秋冰。三九已至,卻和暖如春婶熬,著一層夾襖步出監(jiān)牢的瞬間剑勾,已是汗流浹背埃撵。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虽另,地道東北人暂刘。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像捂刺,于是被迫代替她去往敵國(guó)和親谣拣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文主要介紹移動(dòng)端的加解密算法的分類族展、其優(yōu)缺點(diǎn)特性及應(yīng)用森缠,幫助讀者由淺入深地了解和選擇加解密算法。文中會(huì)包含算法的...
    蘋果粉閱讀 11,470評(píng)論 5 29
  • 前言 《圖解密碼技術(shù)》一書介紹了很多關(guān)于密碼的知識(shí)仪缸,通讀一遍需要不少時(shí)間贵涵。為了方便學(xué)習(xí),我對(duì)書中關(guān)鍵的部分進(jìn)行了總...
    咖枯閱讀 7,162評(píng)論 1 25
  • 1 公鑰私鑰 2 公鑰加密 別人用A的公鑰加密傳輸?shù)男畔⑶』挥蠥的私鑰可以解密宾茂。保證了傳輸?shù)男畔⒌陌踩浴?2 私...
    skykira閱讀 951評(píng)論 0 1
  • 爆竹聲中一歲除,春風(fēng)送暖入屠蘇拴还。千門萬戶曈曈日跨晴,總把新桃換舊符。 除夕之夜大家各相與贈(zèng)送片林,稱“饋歲”端盆;長(zhǎng)幼聚歡,祝...
    老實(shí)人學(xué)說話閱讀 223評(píng)論 0 1
  • 通過一個(gè)職業(yè)教育網(wǎng)站約了一個(gè)教魔方的老師,課時(shí)費(fèi)幾百孝偎。去之前访敌,跟幾個(gè)朋友興奮地談起此事,他們get不到我興奮的點(diǎn)衣盾,...
    我的朋友菜菜閱讀 4,383評(píng)論 32 53