概念:
編碼 解碼 防止中文亂碼
加密 解密 安全性
將明文---密文(看不懂)
Base64
概念:Base64編碼可用於在HTTP環境下傳遞較長的標識信息
爲了保證所輸出的編碼位可讀字符,Base64制定了一個編碼表,以便進行統一轉換。
編碼表的大小爲2^6=64,這也是Base64名稱的由來。
工作原理:
Base64編碼要求把3個8位字節(3*8=24)轉化爲4個6位的字節(4*6=24),之後在6位的前面補兩個0,
形成8位一個字節的形式。 如果剩下的字符不足3個字節,則用0填充,輸出字符使用'=',因此編碼後輸出的文
本末尾可能會出現1或2個'='。
代碼:
編碼:byte[] encode=Base64.encode(需要編碼的字節數組,Base64.DEFAULT);
String strEncode=Base64.encodeToString(需要編碼的字節數組,Base64.DEFAULT);
解碼:byte[] decode=Base64.decode(需要解碼的字節數組,Base64.DEFAULT);
-------------------------------------------------------------------------------------
URL編碼解碼 URLEncode URLDecode
作用:對URL進行encode處理 保證中文和特殊符號的傳遞
URLEncode:
特別需要注意的是這個方法對符號也做了編碼,"\" ,"&","=",,":"和" ",並把空格" " 轉換成了 + 。
1、數字和字母不變,中文會變化;
2、空格變爲"+"號;
3、其他被編碼成"%xx"加上他們的ASCII的十六進制。
一般情況url地址中可能既含有中文也含有英文 URLEncode主要是對url地址中的中文進行編碼 不要將整個的
url地址進行編碼 可以將中文截取後編碼再於其他url拼接
URLDecode:
解碼和編碼的唯一不同是:解碼時只對16進制數(中文編碼)解碼,而反斜槓/,英文,數字是不會有所改變的,
編碼:String encode=URLEncode.encode(需要編碼的字符串,編碼字符集)
解碼:String decode=URLDecode.decode(需要解碼的字符串,解碼字符集)
-------------------------------------------------------------------------------------
MD5加密
概念: MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。
是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),
原理:MD5的典型應用是對一段信息(Message)產生信息摘要(Message-Digest),以防止被篡改
MD5就可以爲任何文件(不管其大小、格式、數量)產生一個同樣獨一無二的“數字指紋”,如果任何人對文件名做了任何改動,
其MD5值也就是對應的“數字指紋”都會發生變化。
應用場景:
1.當用戶登錄的時候,系統把用戶輸入的密碼進行MD5 Hash運算,然後再去和保存在文件系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道用戶密碼的明文的情況下就可以確定用戶登錄系統的合法性。這可以避免用戶的密碼被具有系統管理員權限的用戶知道。
2.上傳或者下載文件時,可以先獲取文件的MD5的值 上傳或者下載完畢後再次獲取這個值 對比兩次的值是否相同
如果相同則說明文件沒有缺失 否則文件缺失
MessageDigest digest=MessageDigest.getInstance("MD5");
//調用digest(指定當前需要加密的字節數組)
byte[] encode=digest.digest(info.getBytes("utf-8"));
-------------------------------------------------------------------------------------
對稱加密 AES算法
概念:
在對稱加密算法中,數據發信方將明文(原始數據)和加密密鑰(mi yao)一起經過特殊加密算法處理後,
使其變成複雜的加密密文發送出去。收信方收到密文後,若想解讀原文,則需要使用加密時用過的密鑰及相同算法
的逆算法對密文進行解密,才能使其恢復成可讀明文。
優缺點: 優點:算法公開、計算量小、加密速度快、加密效率高。
缺點:交易雙方都使用同樣鑰匙,安全性得不到保證
//1.創建加解密引擎對象 "AES/ECB/PKCS5Padding" 標示當前採用的加密算法爲aes算法
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
//2.生成aes加解密算法對象
SecretKeySpec secret=new SecretKeySpec(key.getBytes(),"AES");
//3.初始化加解密引擎對象
cipher.init(mode,secret);---mode模式不同代表是加密或者解密 Cipher.ENCRYPT_MODE加密 Cipher.DECRYPT_MODE解密
//4.生成最終的明文/密文
result=cipher.doFinal(data);
-------------------------------------------------------------------------------------
非對稱加密: RSA算法
概念:
非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,
如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應
的公開密鑰才能解密。因爲加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。
優缺點: 優點:安全性較高
缺點:加密和解密花費時間長、速度慢,只適合對少量數據進行加密。
//模
private static final String MODULUS =""
//公鑰
private static final String PUB_KEY =""
//私鑰
private static final String PRI_KEY =""
加密:
//1. 創建加密引擎對象
Cipher cipher=Cipher.getInstance("RSA");
//2.創建祕鑰工廠工廠
KeyFactory factory=KeyFactory.getInstance("RSA");
//3.生成RSA公鑰對象
RSAPublicKeySpec keySpec=new RSAPublicKeySpec(new BigInteger(MODULUS),
new BigInteger(PUB_KEY));
//4.生成公鑰
PublicKey publicKey=factory.generatePublic(keySpec);
//5.初始化
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
//6.加密
return cipher.doFinal(data);
解密:
Cipher cipher=Cipher.getInstance("RSA");
KeyFactory factory=KeyFactory.getInstance("RSA");
RSAPrivateKeySpec keySpec=new RSAPrivateKeySpec(new BigInteger(MODULUS),
new BigInteger(PRI_KEY));
PrivateKey privateKey=factory.generatePrivate(keySpec);
cipher.init(Cipher.DECRYPT_MODE,privateKey);
return cipher.doFinal(data);
詳細描述::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Base64:
BASE64 嚴格地說,屬於編碼格式,而非加密算法
>>>import base64 2 >>> s = 'hello,word!' 3 4 >>> base64.b64encode(bytes(s,'ascii')) #base64編碼,編碼的字符串必須是二進制形式的 5 b'aGVsbG8sd29yZCE=' 6 7 >>> base64.b64decode(b'aGVsbG8sd29yZCE=') #base64解碼 8 b'hello,word!'
MD5:
MD5(Message Digest algorithm 5,信息摘要算法)
1 >>> import hashlib 2 >>> m = hashlib.md5() 3 >>> m.update(b'hello,word!') 4 >>> m.hexdigest() 5 '9702d6722a0901398efd4ecb3a20423f'
DES:
DES(Data Encryption Standard,數據加密算法)
# coding=utf-8 2 3 from Crypto.Cipher import DES3 4 from Crypto import Random 5 import binascii 6 7 key = '1234567890!@#$%^' 8 iv = Random.new().read(8) #iv值必須是8位 9 cipher1 = DES3.new(key,DES3.MODE_OFB,iv) #密文生成器,採用MODE_OFB加密模式 10 encrypt_msg = iv + cipher1.encrypt('我是明文必須是八') 11 #附加上iv值是爲了在解密時找到在加密時用到的隨機iv,加密的密文必須是八字節的整數倍,最後部分 12 #不足八字節的,需要補位 13 print '加密後的值爲:',binascii.b2a_hex(encrypt_msg) #將二進制密文轉換爲16進制顯示 14 15 16 cipher2 = DES3.new(key,DES3.MODE_OFB,iv) #解密時必須重新創建新的密文生成器 17 decrypt_msg = cipher2.decrypt(encrypt_msg[8:]) #後八位是真正的密文 18 print '解密後的值爲:',decrypt_msg
AES:(與des類似)
# coding=utf-8 2 3 from Crypto.Cipher import AES 4 from Crypto import Random 5 import binascii 6 7 key = '1234567890!@#$%^' #祕鑰,必須是16、24或32字節長度 8 iv = Random.new().read(16) #隨機向量,必須是16字節長度 9 10 cipher1 = AES.new(key,AES.MODE_CFB,iv) #密文生成器,MODE_CFB爲加密模式 11 12 encrypt_msg = iv + cipher1.encrypt('我是明文') #附加上iv值是爲了在解密時找到在加密時用到的隨機iv 13 print '加密後的值爲:',binascii.b2a_hex(encrypt_msg) #將二進制密文轉換爲16機制顯示 14 15 16 cipher2 = AES.new(key,AES.MODE_CFB,iv) #解密時必須重新創建新的密文生成器 17 decrypt_msg = cipher2.decrypt(encrypt_msg[16:]) #後十六位是真正的密文 18 print '解密後的值爲:',decrypt_msg.decode('utf-8')