1. 保護(hù)隱私數(shù)據(jù)不被未授權(quán)訪問掰伸;
什么是加密
1. 保護(hù)隱私數(shù)據(jù)不被未授權(quán)訪問站辉;
2. 用于隱藏真實(shí)數(shù)據(jù),進(jìn)行安全的數(shù)據(jù)傳遞兑巾;
3. 避免數(shù)據(jù)被第三方截獲条获;
2. 用于隱藏真實(shí)數(shù)據(jù),進(jìn)行安全的數(shù)據(jù)傳遞闪朱;
3. 避免數(shù)據(jù)被第三方截獲月匣;
古代加密方式:置換(反序,替換)
加密算法的歷史
古代加密方式:置換(反序奋姿,替換)
現(xiàn)代加密算法:帶密碼的加密锄开、兩套密碼的加密、動(dòng)態(tài)密碼加密称诗。
現(xiàn)代加密:對稱加密萍悴、非對稱加密
現(xiàn)代加密算法:帶密碼的加密、兩套密碼的加密寓免、動(dòng)態(tài)密碼加密癣诱。
現(xiàn)代加密:對稱加密、非對稱加密
1. 能否通過一個(gè)密碼進(jìn)行加密和解密的操作袜香,如果能就是對稱加密撕予。
對稱加密
1. 能否通過一個(gè)密碼進(jìn)行加密和解密的操作,如果能就是對稱加密蜈首。
2. 對稱加密都有密碼实抡。
3. 常用的加密方式DES, AES
2. 對稱加密都有密碼。
3. 常用的加密方式DES, AES
DES 加密算法
說明
DES 通過密碼欢策,對數(shù)據(jù)進(jìn)行大量循環(huán)方式的異或
操作吆寨,從而生成加密后的數(shù)據(jù)。
DES對數(shù)據(jù)依次進(jìn)行加密踩寇,一次加密是8個(gè)字節(jié)一起
因此啄清,DES密碼,必須是64bit俺孙,也就是8個(gè)字節(jié)
DES加密實(shí)現(xiàn)
1. DES加密之后的數(shù)據(jù)辣卒,不能夠直接生成字符串的;
2. 加密: ?M 明文鼠冕, K 12345678, D 加密后數(shù)據(jù)
D = DES(M, K) 用K密碼對M進(jìn)行加密生成D
3. 解密:M = DES(D, K)
4. 這種可以通過相同的密碼進(jìn)行加密和解密的叫做對稱加密添寺。
DES API
1. Cipher 加密/解密引擎,用于實(shí)際的處理
2. cipher.init(int mode, Key key) 設(shè)置加密還是解密
3. Key 對于DES需要使用 SecretKeyFactory 進(jìn)行密碼創(chuàng)建
創(chuàng)建密碼對象用的是 DESKeySpec
4. Cipher update(byte[]) 每次調(diào)用都會返回一部分處理的數(shù)據(jù)懈费,DES API doFinal 就只能返回最后一次的數(shù)據(jù)计露,不是完整的,
5. DES 加密推薦使用 doFinal 來完成。
DESede 加密方式
對于DES 或者 DESede 而言票罐,如果實(shí)現(xiàn)DESede的話叉趣,那么:Cipher 算法調(diào)整為 DESede,SecretKeyFactory制定的算法该押,同樣調(diào)整為 DESede, 其中需要使用 DESedeKeySpec 生成密碼疗杉,而且密碼的長度 24個(gè)字節(jié)。
AES 加密算法
特點(diǎn)
1. 速度快
2. 強(qiáng)度高
3. Java中默認(rèn)支持 AES 128bit 加密
AES 256bit 美國軍方的標(biāo)準(zhǔn)蚕礼;
AES 256bit 需要美國出口許可證才可以用烟具。
DES, AES 特性 - 分塊加密
Padding: 加密的時(shí)候,分塊是數(shù)據(jù)按照固定長度一塊一塊處理奠蹬,可以通過 Cipher 參數(shù)進(jìn)行分塊的控制
NoPadding:如果數(shù)據(jù)不是塊長度的倍數(shù)朝聋,那么不會填充
一般情況下,填充會自動(dòng)向數(shù)據(jù)后面添加 字節(jié)0 補(bǔ)齊
AES 常用的Cipher算法
1. AES 默認(rèn)可以使用囤躁,有時(shí)也會出現(xiàn)BadPaddingException,不建議使用
2. AES/ECB/PKCS5Padding ?另外一種AES 加密形式冀痕,建議使用
3. AES/CBC/PKCS5Padding 內(nèi)部的算法模式不同。
4.算法及密碼長度限制
算法/模式/填充 ? ? ? ? ? ? ? ?16字節(jié)加密后數(shù)據(jù)長度 ? ? ? ?不滿16字節(jié)加密后長度
AES/CBC/NoPadding ? ? ? ? ? ? 16 ? ? ? ? ? ? ? ? ? ? ? ? ?不支持
AES/CBC/PKCS5Padding ? ? ? ? ?32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES/CBC/ISO10126Padding ? ? ? 32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES/CFB/NoPadding ? ? ? ? ? ? 16 ? ? ? ? ? ? ? ? ? ? ? ? ?原始數(shù)據(jù)長度
AES/CFB/PKCS5Padding ? ? ? ? ?32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES/CFB/ISO10126Padding ? ? ? 32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES/ECB/NoPadding ? ? ? ? ? ? 16 ? ? ? ? ? ? ? ? ? ? ? ? ?不支持
AES/ECB/PKCS5Padding ? ? ? ? ?32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES/ECB/ISO10126Padding ? ? ? 32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES/OFB/NoPadding ? ? ? ? ? ? 16 ? ? ? ? ? ? ? ? ? ? ? ? ?原始數(shù)據(jù)長度
AES/OFB/PKCS5Padding ? ? ? ? ?32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES/OFB/ISO10126Padding ? ? ? 32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES/PCBC/NoPadding ? ? ? ? ? ?16 ? ? ? ? ? ? ? ? ? ? ? ? ?不支持
AES/PCBC/PKCS5Padding ? ? ? ? 32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES/PCBC/ISO10126Padding ? ? ?32 ? ? ? ? ? ? ? ? ? ? ? ? ?16
AES API
1. Cipher 加密/解密引擎
2. 創(chuàng)建密碼生成器 KeyGenerator,設(shè)置密碼生成的密碼長度 128 bit和設(shè)備安全隨機(jī)數(shù) 狸演,
如keyGenerator.init(128, new SecureRandom(password.getBytes()));
3.生成 SecretKey keyGenerator.generateKey()
4. 初始化 引擎 cipher.init(Cipher.ENCRYPT_MODE, secretKey)
5. 加密處理 cipher.doFinal(byte[] origData)
非對稱加密算法
加密實(shí)現(xiàn)
1. M 明文 D 公鑰 E 密鑰 C 密文 n 公共模數(shù) 0x10001
2. C = M ^ E mod n
3. M = C ^ D mod n
4. 通常 E + n 作為 私鑰隱秘保存
5. 通常 D + n 作為公鑰言蛇,可以給任何人。
6. 通過 C ^ D mon => M
7. E 通過計(jì)算兩個(gè) 1024bit 以上的整數(shù)(并且是素?cái)?shù)),
公鑰 ?D = (素?cái)?shù)1 - 1) * (素?cái)?shù)2 - 1) E 包含兩個(gè)素?cái)?shù)
D 安全性足夠高
非對稱加密的API
1. Cipher 可以進(jìn)行加密宵距,用的是 “RSA”, “DSA”
2. KeyPairGenerator 生成 公鑰和私鑰
3. cipher init 加密用 私鑰腊尚, init 解密 用的是公鑰初始化。
加密實(shí)現(xiàn)
1. M 明文 D 公鑰 E 密鑰 C 密文 n 公共模數(shù) 0x10001
2. C = M ^ E mod n
3. M = C ^ D mod n
4. 通常 E + n 作為 私鑰隱秘保存
5. 通常 D + n 作為公鑰满哪,可以給任何人跟伏。
6. 通過 C ^ D mon => M
7. E 通過計(jì)算兩個(gè) 1024bit 以上的整數(shù)(并且是素?cái)?shù)),
公鑰 ?D = (素?cái)?shù)1 - 1) * (素?cái)?shù)2 - 1) E 包含兩個(gè)素?cái)?shù)
D 安全性足夠高
非對稱加密的API
1. Cipher 可以進(jìn)行加密,用的是 “RSA”, “DSA”
2. KeyPairGenerator 生成 公鑰和私鑰
3. cipher init 加密用 私鑰翩瓜, init 解密 用的是公鑰初始化。
Base64携龟、MD5編碼
android.util.Base64類
encode(byte[],flag)
encodeToString(byte[],flag) 編碼并轉(zhuǎn)換成字符串
decode(byte[],flag) 解碼
flags標(biāo)識
Base64.DEFAULT 默認(rèn)兔跌,如果字符串過長(超過76)時(shí)自動(dòng)在中間加一個(gè)換行符,字符串最后也會加一個(gè)換行符峡蟋》匚Γ可能會導(dǎo)致和其他模塊對接時(shí)結(jié)果不一致,建議使用Base64.NO_WRAP
Base64.NO_WRAP 不換行處理
Base64.NO_PADDING 結(jié)束位置省略“==”
it.sauronsoftware.base64.Base64類
第三方Base64編碼蕊蝗、解碼工具類
Base64.decode(byte[]);
Base64.encode(byte[])
MD5
java.security.MessageDigest
MD5加密: