URL编码
URL编码时浏览器发送数据给服务器时使用的编码。
编码规则
A-Z, a-z, 0-9 以及 -_.* 保持不变
空格用%20表示
-
其它字符用%XX表示
- < : %3C
- 中: %E4%B8%AD(UTF8: 0xe4b8ad)
目的
URL编码的目的是把任意的文本编码为%前缀的文本,编码后的文本仅包含A-Z, a-z, 0-9, -_.*, %,为了便于浏览器和服务器的处理。
Base64
Base64编码是一种把二进制数据用文本表示的编码算法。
编码规则
- 把3个字符用字节表示(24 bits)拆分成4份,每份前面补0,变成4个字节。
转换前 11111111, 11111111, 11111111 (二进制)
转换后 <font color="red">00</font>111111, <font color="red">00</font>111111, <font color="red">00</font>111111, <font color="red">00</font>111111 (二进制)
每76个字符加一个换行符
如果字节数不是3的整数倍,末尾补0x00(=)或0x00 0x00,所以会看到很多经过Base64编码的字符串末尾会出现=号或==号。
Tips:
- 如果希望编码后去掉=号,可以使用Base64.getEncoder().withoutPadding(),实际上末尾有没有=号,对解码没有影响
- 如果经过Base64编码需要在URL中传输,可以使用Base64.getUrlEncoder(),这样做的结果是把+号变成-,把/变成_,这样就能够在URL中进行传输了
- 任意二进制数据经过Base64编码长度会增加1/3
- 其它编码:Base32,Base48,Base58
目的
是一中用文本表示二进制数据的方式,适用于文本协议。
- 缺点:效率下降(长度增加1/3)
- 应用:电子邮件协议
MD5
MD5(MD5 Message-Digest Algorithm)是一种摘要算法又称为Hash算法、散列算法、数字指纹。
特点
- 计算任意长度数据的摘要(固定长度)
- 相同的输入始终得到相同的输出
- 不同的输入尽量得到不同的输出
Java的Object.hashCode()方法就是一个摘要算法。
目的
验证原始数据是否被篡改。
碰撞
对于输入集合元素的数量大于输出集合元素的数量时,必然有不同的输入,得到相同的输出情况发生,这就叫做碰撞。
安全摘要算法具有的特点
- 碰撞率低
- 不能猜测输出
- 对于任意一个bit的变化的输入会得到完全不同的输出
- 很难从输出反推输入(只能暴力穷举)
常用的摘要算法
Left-Aligned | Center Aligned | Right Aligned |
---|---|---|
col 3 is | 128 bits | 16 bits |
SHA-1 | 160 bits | 20 bits |
SHA-256 | 256 bits | 32 bits |
RipeMD-160 | 160 bits | 20 bits |
用途
校验文件的完整性
存储用户口令
彩虹表攻击
黑客通过常用口令和MD5值形成一个二维表(彩虹表),再通过数据库口令的MD5值,在二维表中找到原始口令,从而获取用户口令。
Tips: 如何抵御彩虹表攻击?
可以采用对每个口令额外添加随机数salt,将md5(password)变成md5(password+salt),再将password和salt存入数据库中,这样便很难通过彩虹表方式进行攻击。
BouncyCastle
BouncyCastle是提供的加密/哈希算法的第三方,主要提供了JDK没有提供的算法,如RipeMD160。
Tips: 使用第三方算法前需要通过Security.addProvider()注册
Hmac
Hmac(Hash-based Message Authentication Code)是基于密钥的消息认证码算法,是更安全的消息摘要算法。HmacMD5可以看作带安全Salt的MD5
特点
- Hmac是把Key混入摘要的算法(将salt替换成secret_key,secret_key具有64 bytes,更安全)
- 可以配合MD5、SHA-1等摘要算法
- 摘要长度和原摘要算法长度相同
对称加密算法
对称加密算法指加密和解密使用同一个密钥,例如WinRAR。
- 加密:encrypt(key, message) -> encrypted
- 解密:decrypt(key, encrypted) -> message
常用的对称加密算法
- DES(密钥过短,可在短时间内暴力破解,废弃)
- AES(密钥长度是128/192/256,使用256位加密需要修改JDK的policy文件)
- IDEA
使用对称加密算法需要指定:算法名称/工作模式/填充模式
PBE
PBE(Password Based Encryption),可以理解为对称加密算法+摘要算法。
应用
如果把随机salt存储在U盘上,就得到一个“口令”+USB key的加密软件,这样做的好处是,即使用户的口令非常弱,在没有USB Key的情况下依然无法破解。
密钥交换算法
用来解决在不安全的信道上安全地传输密钥问题。比如,DH(Diffie-Hellman)算法。
Tips: DH算法不能解决中间人攻击问题。
非对称加密算法
非对称加密就是加密和解密使用的是不同的密钥,只有同一个公钥、私钥对才能正常加密、解密。
-
第一种方式
-
加密:用自己的私钥加密,然后发送给对方
encrypt(privateKeyA, message) -> encrypted
-
解密:对方用自己的公钥解密
decrypt(publicKeyA, encrypted) -> message
-
-
第二种方式
-
加密:用对方的公钥加密,然后发送给对方
encrypt(publicKeyB, message) -> encrypted
-
解密:对方用自己的私钥解密
decrypt(privateKeyB, encrypted) -> message
-
典型的算法有:
- RSA(Ron Rivest, Adi Shamir, Leonard Adleman,三个人名的缩写)算法
特点
- 优点:
- 对称加密需要协商密钥,而非对称加密可以安全地公开各自的密钥
- 缺点:
- 运算速度慢
- 只使用非对称加密不能防止中间人攻击问题
数字签名算法
数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用摘要算法对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过。
目的
- 确认消息是某个发送方发送的
- 发送方不能抵赖他发送的消息
- 数据在传输过程中没有被修改
常用的数字签名算法
- RSA签名算法
- MD5withRSA
- SHA1withRSA
- SHA256withRSA
- DSA(Digital Signature Algorithm)签名算法,使用EIGamal数字签名算法,DSA只能配合SHA使用
- SHA1withDSA
- SHA256withDSA
- SHA512withDSA
- 其它数字签名算法
- ECDSA(Elliptic Curve Digital Signature Algorithm,由Bouncy Castle提供)
Tips: DSA数字签名算法比RSA数字签名算法更快,使用方式没有区别
数字证书
数字证书是集合了多种密码学算法,用于实现数据加解密、身份认证、签名等多种功能的网络安全标准。
数字证书采用链式签名管理,顶级CA证书已内置在操作系统中。
应用
- HTTPS(HTTP over SSL)
- 服务器发送证书给客户端(发送公钥、签名、CA)
- 客户端验证证书
- 客户端用证书公钥加密消息后发送给服务器
- 服务器用自己的私钥解密
- 随后使用AES对称加密进行通信