Android開發(fā)之加密解密

加密算法

主要作用就是隱藏信息,讓信息不可見,也用于提高網(wǎng)絡(luò)訪問的安全。

常見加密算法

  • BASE64 用于二進(jìn)制內(nèi)容轉(zhuǎn)換為可編輯的文本內(nèi)容
  • MD5 信息摘要算法
  • SHA 安全散列算法
  • HMAC 散列消息鑒別碼
  • DES 數(shù)據(jù)加密算法
  • PBE 基于密碼驗(yàn)證
  • RSA 非對(duì)稱加密算法
  • SSL SSL加密 - https協(xié)議
  • DH 密鑰一致協(xié)議
  • DSA 數(shù)字簽名
  • ECC 橢圓曲線密碼編碼學(xué)

BASE64

嚴(yán)格地說,屬于編碼格式,而非加密算法,用于二進(jìn)制內(nèi)容轉(zhuǎn)換為可編輯的文本內(nèi)容。


Base64.jpg

按照RFC2045的定義,Base64被定義為:
Base64內(nèi)容傳送編碼被設(shè)計(jì)用來把任意序列的8位字節(jié)描述為一種不易被人直接識(shí)別的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)。常見于郵件、http加密,截取http信息,你就會(huì)發(fā)現(xiàn)登錄操作的用戶名、密碼字段通過BASE64加密的。

需要明文保存二進(jìn)制數(shù)據(jù)時(shí),可以將不可打印的二進(jìn)制數(shù)據(jù)經(jīng)過Base64編碼轉(zhuǎn)成可打印的字符串。

Mozilla Thunderbird和Evolution用Base64來保密電子郵件密碼。

Base64也會(huì)經(jīng)常用作一個(gè)簡(jiǎn)單的“加密”來保護(hù)某些數(shù)據(jù),而真正的加密通常都比較繁瑣。

垃圾訊息傳播者用Base64來避過反垃圾郵件工具,因?yàn)槟切┕ぞ咄ǔ6疾粫?huì)翻譯Base64的訊息。

在LDIF檔案,Base64用作編碼字串。

編碼后的內(nèi)容,是由64個(gè)字符(大小寫英文字母 0-9 + / (= 補(bǔ)位符,填充字符))組成的序列,成為Base64。可逆的編碼方式。

Android中自帶的Base64加密算法:
Android自身帶有Base64加密與解密的包,可以方便地加密密碼方便傳輸。

 String base64Token = Base64.encodeToString(token.trim().getBytes(), Base64.NO_WRAP);
 byte[] buffer = Base64.decode(base64Token,Base64.DEFAULT);

看起來用法與Java所帶的sun.misc的Base64Encoder這些用法差不多,但應(yīng)該留意到了,在encode的時(shí)候,會(huì)有一個(gè)參數(shù)Flags(即上面代碼中的Base64.DEFAULT)這個(gè)參數(shù)有什么用呢?根據(jù)Android SDK的描述,這種參數(shù)有5個(gè):

  • DEFAULT 這個(gè)參數(shù)是默認(rèn),使用默認(rèn)的方法來加密
  • CRLF 這個(gè)參數(shù)看起來比較眼熟,它就是Win風(fēng)格的換行符,意思就是使用CRLF 這一對(duì)作為一行的結(jié)尾而不是Unix風(fēng)格的LF
  • NO_PADDING 這個(gè)參數(shù)是略去加密字符串最后的”=”
  • NO_WRAP 這個(gè)參數(shù)意思是略去所有的換行符(設(shè)置后CRLF就沒用了)
  • URL_SAFE 這個(gè)參數(shù)意思是加密時(shí)不使用對(duì)URL和文件名有特殊意義的字符來作為加密字符,具體就是以-和 _ 取代+和/

基本的單向加密算法

單項(xiàng)的加密,不能解密。
MD5(Message Digest algorithm 5,信息摘要算法)縮寫,廣泛用于加密和解密技術(shù),常用于文件校驗(yàn)。

MD5.jpg

不管文件多大,經(jīng)過MD5后都能生成唯一的MD5值。好比現(xiàn)在的ISO校驗(yàn),都是MD5校驗(yàn)。怎么用?當(dāng)然是把ISO經(jīng)過MD5后產(chǎn)生MD5的值。一般下載linux-ISO的朋友都見過下載鏈接旁邊放著MD5的串。就是用來驗(yàn)證文件是否一致的。

 // 獲取一個(gè)信息加密的加密的摘要對(duì)象
 // getInstance需要傳遞一個(gè)算法的名稱
 MessageDigest md = MessageDigest.getInstance(“MD5”);
MD5.png
MD5用戶登錄.jpg

SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鑒別碼)

MD5、SHA、HMAC這三種加密算法,可謂是非可逆加密,就是不可解密的加密方法。

我們通常只把他們作為加密的基礎(chǔ),單純的以上三種的加密并不可靠。
MD5、SHA 可以通過暴力碰撞算法破解。

復(fù)雜的對(duì)稱加密(DES、PBE)

DES(Data Encryption Standard,數(shù)據(jù)加密算法)
是IBM公司于1975年研究成功并公開發(fā)表的,是一種堆成加密算法.

DES.jpg

DES算法的入口參數(shù)有三個(gè): Key、 Data、 Mode
其中Key為8個(gè)字節(jié)共64位,是DES算法的工作密鑰;
Data也為8個(gè)字節(jié)64位,是要被加密或被解密的數(shù)據(jù);
Mode為DES的工作方式,有兩種:加密或解密。
DES算法把64位的明文輸入塊變?yōu)?4位的密文輸出塊,它所使用的密鑰也是64位。

PBE(Password-based encryption,基于密碼驗(yàn)證)

非對(duì)稱加密算法

RSA(算法的名字以發(fā)明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)

RSA1.jpg
RSA2.jpg
RSA3.jpg

這種算法1978年就出現(xiàn)了,它是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。
這種加密算法的特點(diǎn)主要是密鑰的變化,DES只有一個(gè)密鑰。相當(dāng)于只有一把鑰匙,如果這把鑰匙丟了,數(shù)據(jù)也就不安全了。
RSA同時(shí)有兩把鑰匙,公鑰與私鑰。
同時(shí)支持?jǐn)?shù)字簽名。數(shù)字簽名的意義在于,對(duì)傳輸過來的數(shù)據(jù)進(jìn)行校驗(yàn)。確保數(shù)據(jù)在傳輸工程中不被修改。

流程分析:
甲方構(gòu)建密鑰對(duì)兒,將公鑰公布給乙方,將私鑰保留。
甲方使用私鑰加密數(shù)據(jù),然后用私鑰對(duì)加密后的數(shù)據(jù)簽名,發(fā)送給乙方簽名以及加密后的數(shù)據(jù);
乙方使用公鑰、簽名來驗(yàn)證待解密數(shù)據(jù)是否有效,如果有效使用公鑰對(duì)數(shù)據(jù)解密。
乙方使用公鑰加密數(shù)據(jù),向甲方發(fā)送經(jīng)過加密后的數(shù)據(jù);甲方獲得加密數(shù)據(jù),通過私鑰解密。

DH(Diffie-Hellman算法,密鑰一致協(xié)議)
DSA(Digital Signature Algorithm,數(shù)字簽名)
ECC(Elliptic Curves Cryptography,橢圓曲線密碼編碼學(xué))

SSL加密 - https協(xié)議

http 明文
https SSL加密
OpenSSL - ssl加密第三方的開源組件

安裝數(shù)字證書
證書存放在瀏覽器中,在服務(wù)端也有對(duì)應(yīng)證書的存根 。
訪問網(wǎng)站時(shí),通過證書進(jìn)行加密。
服務(wù)器通過證書存根來對(duì)加密的數(shù)據(jù)進(jìn)行解密。

使用

在Android開發(fā)中,一般只用到Base64,MD5,RSA,DES。

我們用Base64編碼:大家要注意身體,不要熬夜寫代碼

String oldWord = "大家要注意身體,不要熬夜寫代碼";
        try {
            //編碼
            String encodeWord = Base64.encodeToString(oldWord.getBytes("utf-8"), Base64.NO_WRAP);
            Log.i("Rair", " encode wrods = " + encodeWord);
            //解碼
            String decodeWord = new String(Base64.decode(encodeWord, Base64.NO_WRAP), "utf-8");
            Log.i("Rair", "decode wrods = " + decodeWord);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

運(yùn)行后得到:

10-19 00:11:18.062 5899-5899/com.rair.encrptdemo I/Rair:  encode wrods = 5aSn5a626KaB5rOo5oSP6Lqr5L2T77yM5LiN6KaB54as5aSc5YaZ5Luj56CB
10-19 00:11:18.062 5899-5899/com.rair.encrptdemo I/Rair: decode wrods = 大家要注意身體,不要熬夜寫代碼

具體用法可參考Demo
https://coding.net/u/Rair/p/RairDemo/git

https://github.com/Rairmmd/android-demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 之前一直對(duì)加密相關(guān)的算法知之甚少,只知道類似DES、RSA等加密算法能對(duì)數(shù)據(jù)傳輸進(jìn)行加密,且各種加密算法各有...
    Henryzhu閱讀 3,208評(píng)論 0 14
  • 隨著對(duì)于安全度的不斷要求,對(duì)于數(shù)據(jù)加解密與破解之間的斗爭(zhēng),加解密的方式也在不斷發(fā)生著變化,來看看現(xiàn)在流行的一些加解...
    zhouhao_180閱讀 2,216評(píng)論 1 12
  • 本文主要介紹移動(dòng)端的加解密算法的分類、其優(yōu)缺點(diǎn)特性及應(yīng)用,幫助讀者由淺入深地了解和選擇加解密算法。文中會(huì)包含算法的...
    蘋果粉閱讀 11,671評(píng)論 5 29
  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開發(fā)過程中,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲(chǔ)、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹閱讀 3,018評(píng)論 0 6
  • 232134123
    打包個(gè)饅頭去旅行閱讀 139評(píng)論 0 0

友情鏈接更多精彩內(nèi)容