Android 加密技術(shù)使用

數(shù)據(jù)加密是過程通過對文件或數(shù)據(jù)進行算法計算后得到結(jié)果一種處理過程宽气,讓數(shù)據(jù)變成不能夠閱讀的形式随常,也可以根據(jù)不同的算法來解析生成的數(shù)據(jù),讓加密數(shù)據(jù)還原成原來的數(shù)據(jù)萄涯。通過加密來實現(xiàn)保護數(shù)據(jù)绪氛,讓數(shù)據(jù)不被別人竊取并閱讀的目的。加密的分類分為兩種非對稱加密和對稱加密涝影,下面介紹三種常見的加密使用枣察。

安全哈希算法(SHA)

安全哈希算法(Secure Hash Algorithm,縮寫為SHA)是一個密碼散列函數(shù)家族燃逻。能計算出一個數(shù)字消息所對應到的序目,長度固定的字符串的算法。安全哈希算法包含很多種算法其中包括(SHA系列 MD5 等等很多)唆樊,安全哈希算法是一種單向加密的過程宛琅,也就是說在加密之后沒有辦法解密,那么安全哈希算法有什么左右呢逗旁?

單向加密使用場景.png

從上圖可以看出通過對相關文檔進行加密得到加密后的字符串嘿辟,再將文檔和字符串一起發(fā)送到服務器,服務器獲取到數(shù)據(jù)后再用相同的加密方法對相關文檔再次加密得到加密后的字符串片效,把在服務器得到的加密字符串與通過網(wǎng)絡接收到的加密字符串做比較红伦,如果相同就證明文檔沒有出問題(被人篡改一類操作),如果不同則認定為此次操作存在非法的可能性就終止操作即可淀衣。單向加密也可以用在密碼登錄時使用昙读,將用戶輸入的密碼加密后傳輸加密的字符串,服務器獲取加密字符串比對數(shù)據(jù)庫中的密碼加密結(jié)果判斷是否登錄膨桥。以上列舉兩種單向加密的使用場景蛮浑,可以知道單向加密只是生成加密后的字符串唠叛,再靈活的運用加密字符串和加密對象而已。

AES算法(高級加密標準)

AES算法(高級加密標準)是一種對稱加密算法一個密碼對應一個密鑰的形式沮稚,能夠加密同時也能解密艺沼。AES算法包括AES、AESWRAP蕴掏、DES障般、ARC4等等,與SHA算法比起來AES算法加密同時可以解密盛杰,Https連接支付寶時也是靠AES進行保護挽荡,下面是AES算法加密使用的代碼:

/**
     * 加密
     * @param content  加密內(nèi)容
     * @param password 加密的密碼 用來生成密鑰
     * @return
     * @throws Exception  會拋出很多異常這里(NoSuchAlgorithmException 沒找到指定算法異常, InvalidKeyException 無效的key異常  等等)
     */
    public byte[] encrypt(String content , String password) throws Exception {
        
        //得到key生成器
        KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);
        //初始化生成器
        kgen.init(128,new SecureRandom(password.getBytes()));
        //獲取秘鑰
        SecretKey secretKey = kgen.generateKey();
        //獲取ecode 編碼格式
        byte[] enCodeFormat = secretKey.getEncoded();
        //轉(zhuǎn)換成AES專用密鑰
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, ALGORITHM);
        //將加密內(nèi)容轉(zhuǎn)為數(shù)組
        byte[] c = content.getBytes();
        //獲取密碼器
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        //初始化密碼器  Cipher.ENCRYPT_MODE(加密模式)
        cipher.init(Cipher.ENCRYPT_MODE,key);
        //執(zhí)行doFinal獲取加密后結(jié)果
        byte[] result = cipher.doFinal(c);

        return  result;
    }

1.獲取KeyGenerator
2.獲取秘鑰
3.獲取密碼器
4.初始化密碼器給出相應的操作模式
5.執(zhí)行doFinal執(zhí)行加密

/**
     * 解密
     * @param content  解密內(nèi)容
     * @param password 解密的密碼 用來生成密鑰進行解密
     * @return
     * @throws Exception  會拋出很多異常這里(NoSuchAlgorithmException 沒找到指定算法異常, InvalidKeyException 無效的key異常  等等)
     */
    public byte[] decrypt(byte[] content , String password) throws Exception {

        //等到key生成器
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        //初始化key生成器
        keyGenerator.init(128,new SecureRandom(password.getBytes()));
        //根據(jù)key生成器獲取秘鑰
        SecretKey secretKey = keyGenerator.generateKey();
        //根據(jù)秘鑰獲取ecode(編碼格式)
        byte[] encoded = secretKey.getEncoded();
        //生成AES指定的秘鑰
        SecretKeySpec key = new SecretKeySpec(encoded,ALGORITHM);
        //生成密碼器
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        //初始化加密器  Cipher.DECRYPT_MODE(解密模式)
        cipher.init(Cipher.DECRYPT_MODE,key);
        //解密
        byte[] result = cipher.doFinal(content);

        return  result;
    }

下面執(zhí)行加密和解密代碼對leavy字符串加密,結(jié)果如下:

AES加密解密結(jié)果輸出.png

從代碼上看加密過程和解密過程步驟唯一的區(qū)別就是在初始化密碼器給出相應的操作模式的時候即供,設置加密和解密模式對應的操作數(shù)值執(zhí)行不同操作定拟。

RSA算法

RSA算法是一種非對稱加密算法,RSA加密可靠性非常高募狂,目前只有短的RSA要是才能被強力破解办素,隨著加密位數(shù)的增加破解難度也會增加就更難破解。RSA加密需要一對鑰匙(公鑰祸穷、私鑰)性穿,使用一把鑰匙加密再使用另一把解密。獲取公鑰私鑰的代碼如下:

public static final String ALGORITHM_RSA = "RSA" ;

    public static final String PUBLIC_KEY = "public_key.dat";

    public static final String PRIVATE_KEY = "private_key.dat";

    public static final int KEY_SIZE = 1024 ;

    /***
     * 生成密鑰對
     * @throws NoSuchAlgorithmException
     * @throws IOException
     */
    public void generatorKeyPair() throws NoSuchAlgorithmException, IOException {
        //獲取秘鑰對生成器
        KeyPairGenerator kp = KeyPairGenerator.getInstance(ALGORITHM_RSA);
        //初始化生成器 KEY_SIZE是1024 也可以是其他長度雷滚,長度越長越難破解也會更加密耗時
        kp.initialize(KEY_SIZE,new SecureRandom());
        //生成密鑰對
        KeyPair keyPair = kp.generateKeyPair();
        //獲取公鑰私鑰
        PublicKey aPublic = keyPair.getPublic();
        PrivateKey aPrivate = keyPair.getPrivate();
        //把公鑰私鑰保存到文件中 
        ObjectOutputStream publicOs = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY));
        ObjectOutputStream privateOS = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY));

        //對象寫入文件
        publicOs.writeObject(aPublic);
        privateOS.writeObject(aPrivate);
        //關流
        privateOS.close();
        publicOs.close();

    }

獲取密鑰對之后可以進行加密解密操作需曾,代碼如下

/**
     * 加密
     * @param content 加密內(nèi)容
     * @return
     * @throws Exception IO異常加密異常等
     */
    public String encrypt(String content) throws Exception {

        //獲取公鑰
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(PUBLIC_KEY));
        //讀對象流
        Key key = (Key) is.readObject();
        //關流
        is.close();
        //獲取密碼器
        Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);
        //初始化密碼器 設置加密模式
        cipher.init(Cipher.ENCRYPT_MODE,key);
        //加密內(nèi)容轉(zhuǎn)數(shù)組
        byte[] bytes = content.getBytes();
        //加密
        byte[] bytes1 = cipher.doFinal(bytes);
        //方便觀看使用BASE64Encoder編碼一下
        BASE64Encoder base64Encoder = new BASE64Encoder();
        String encode = base64Encoder.encode(bytes1);

        return encode;

    }

    /**
     * 解密
     * @param content 解密內(nèi)容
     * @return
     * @throws Exception IO異常加密異常等
     */
    public String decrypt(String content)throws Exception {

        //獲取公鑰
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(PRIVATE_KEY));
        //讀對象流
        Key key = (Key) is.readObject();
        is.close();
        //獲取密碼器
        Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);
        //初始化密碼器 設置加密模式
        cipher.init(Cipher.DECRYPT_MODE,key);
        //加密時返回的字符串編碼過所以這里解碼下那都原始的加密數(shù)據(jù)
        BASE64Decoder base64Decoder = new BASE64Decoder() ;        
        byte[] bytes = base64Decoder.decodeBuffer(content);
        //解密
        byte[] bytes1 = cipher.doFinal(bytes);

        return new String(bytes1);

    }

以下是使用RSA加密解密輸出結(jié)果:

RSA算法加密解密結(jié)果輸出.png

使用RSA加密過程

1.獲取密鑰對為加密解密做準備
2.獲取密鑰
3.獲取密碼器并初始化設置密碼器模式
4.使用密碼器加密解密


在網(wǎng)絡請求時像https請求時,會將數(shù)據(jù)進行AES算法加密再用RSA算法加密祈远,最后在使用SHA加密(舉例說明實際不一定非要這樣加密過程呆万,算法一類都可以自己定制,三種算法組合使用)车份。這樣使https請求變成兩層加密還有一層校驗形式傳輸谋减。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扫沼,隨后出現(xiàn)的幾起案子出爹,更是在濱河造成了極大的恐慌,老刑警劉巖缎除,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件严就,死亡現(xiàn)場離奇詭異,居然都是意外死亡器罐,警方通過查閱死者的電腦和手機梢为,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铸董,你說我怎么就攤上這事祟印。” “怎么了袒炉?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵旁理,是天一觀的道長樊零。 經(jīng)常有香客問我我磁,道長,這世上最難降的妖魔是什么驻襟? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任夺艰,我火速辦了婚禮,結(jié)果婚禮上沉衣,老公的妹妹穿的比我還像新娘郁副。我一直安慰自己,他們只是感情好豌习,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布存谎。 她就那樣靜靜地躺著,像睡著了一般肥隆。 火紅的嫁衣襯著肌膚如雪既荚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天栋艳,我揣著相機與錄音恰聘,去河邊找鬼。 笑死吸占,一個胖子當著我的面吹牛晴叨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矾屯,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼兼蕊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了件蚕?” 一聲冷哼從身側(cè)響起孙技,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骤坐,沒想到半個月后绪杏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡纽绍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年蕾久,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拌夏。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡僧著,死狀恐怖履因,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盹愚,我是刑警寧澤栅迄,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站皆怕,受9級特大地震影響毅舆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愈腾,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一憋活、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虱黄,春花似錦悦即、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泳叠,卻和暖如春作瞄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背析二。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工粉洼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叶摄。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓属韧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛤吓。 傳聞我的和親對象是個殘疾皇子宵喂,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 1. 介紹 數(shù)字簽名、信息加密 是前后端開發(fā)都經(jīng)常需要使用到的技術(shù)会傲,應用場景包括了用戶登入锅棕、交易、信息通訊淌山、oau...
    luckyYU閱讀 10,582評論 1 6
  • 這篇文章主要講述在Mobile BI(移動商務智能)開發(fā)過程中裸燎,在網(wǎng)絡通信、數(shù)據(jù)存儲泼疑、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 2,351評論 0 6
  • 之前的項目中接觸過一些加密的方法德绿,也沒有太仔細的進行記錄和研究。最近在寫SDK時,加密模塊的占比相當之大移稳;借此時機...
    過半_e764閱讀 565評論 0 0
  • 在開發(fā)應用過程中蕴纳,客戶端與服務端經(jīng)常需要進行數(shù)據(jù)傳輸,涉及到重要隱私安全信息時个粱,開發(fā)者自然會想到對其進行加密古毛,即使...
    閑庭閱讀 3,262評論 0 11
  • 心有丘壑萬千稻薇,愿涓涓而始流 書目:《蘇軾全集》 寶繪堂記 (宋)蘇軾 君子可以寓意于物,而不可以留意于物梭稚。寓...
    相遇晚晴天閱讀 869評論 0 7