概念:
编码 解码 防止中文乱码
加密 解密 安全性
将明文---密文(看不懂)
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')