加密算法
主要作用就是隱藏信息,讓信息不可見,也用于提高網(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)容。

按照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)。

不管文件多大,經(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”);


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算法的入口參數(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)



這種算法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