1.数据安全的要点:防窃听,防篡改,防伪造。
2.古代加密方式:
1)移位密码:HELLO==>IFMMP
2)替代密码:HELLO==>P12,5,3
3.现代计算机加密:
1)建立在严格的数学理论基础上
2)密码学逐渐发展成一门科学
4.总结
1)设计一个安全的加密算法非常困难。
2)验证一个加密算法是否安全更加困难。
3)当前被认为安全的加密算法仅仅是迄今为止尚未被攻破。
4)不要自己设计加密算法。
5)不要自己实现加密算法。
6)不要自己修改已有的加密算法。
5.URL编码
1)A~Z,a-z,0-9以及- _ . * 保持不变
2)其他字符以%XX表视:
a. < : %3C
b. 中:%E4%B8%AD(UTF-8: 0xe4b8ad)
4)URL编码是编码算法,不是加密算法。
5)URL编码的目的是把任意文本数据编码位%前缀表示的文本,编码后的文本仅包含A~Z,A-Z,0-9,-_.*,%,便于浏览器和服务器处理。
6.Base64编码
1)什么是Base64:
a.一种把二进制数据用文本表示的编码算法。
b.String base64Encode(byte[] data)
byte[]{0xe4,0xb8,0xad} ---> "5Lit"
2)目的
a.一种用文本(A-Z,A-Z,0-9,+/=)表视二进制内容的方式
b.适用于文本协议
c.效率下降
3)应用:电子邮件协议
4)如果长度不是3的整数倍:
a.末尾补0x00或0x00 0x00
b.编码后加=表视补充了1个字节
c.编码后加==表示补充了2个字节
5)Base64是编码算法,不是加密算法
6)Base64编码的目的是把人以二进制数据编码为文本(长度增加1/3)
7)其他编码:Base32,Base48,Base58
7.MD5摘要算法
1)摘要算法(哈希算法/Hash/Digest/数字指纹):
a.计算任意长度数据的摘要(固定长度)
b.相同的输入数据始终得到相同的输出
c.不同的输入数据尽量得到不同的输出
2)目的:验证原始数据是否被篡改
3) Java的Object.hashCode()方法就是一个摘要算法
a.输入:任意数据
b.输出:固定长度数据(int,byte[4])
c.相同的输入得到相同的输出: equals/hashCode
d.碰撞:两个不同的输入得到了相同的输出。
e.Hash算法的安全性:
a)碰撞率低
b)不能猜测输出
c)输入的任意一个bit的变化会造成输出完全不同
d)很难从输出反推输入(只能依靠暴力穷举)
4)常用的摘要算法:
6)用途:验证文件完整性
7)MD5存储用户口令
a.系统部存储用户原始口令
b.系统存储用户原始口令的MD5
c.如何判断用户口令是否正确:系统计算用户输入的原始口令的MD5并与数据库存储的MD5对比
a)相同:口令正确
b)不相同:口令错误
d.预防彩虹表攻击(对每个口令额外添加随机数salt)
e.总结:MD5是一种常用的哈希算法,输出128bits/16bytes;常用于验证数据完整性,用于存储口令时需要考虑彩虹表攻击。
8.对称加密算法:
1)对称加密算法:加密和解密使用同一个密钥(例:WinRAR)
3)常见的对称加密算法:DES,AES,IDEA,其中DES由于密钥长度过短,容易被短时间暴力破解,所以基本不使用。
4)密钥长度由算法设计决定,AES的密钥长度是128/192/256
5)使用256位加密需要修改JDK的policy文件
6)使用对称加密算法需要制定:算法名称/工作模式/填充模式。
9.如何在不安全的信道上安全的传输密钥
1)密钥交换算法:Diffie-Hellman算法,简称DH算法。
2)DH算法没有办法解决中间人攻击。
10.非对称加密算法
1)非对称加密就是加密和解密使用的不是相同的密钥。
2)加密:用自己的私钥加密,然后发送给对方,解密:对方用自己的公钥解密
3)加密:用对方的公钥加密,然后发送给对方,解密:对方用自己的私钥解密
4)优点:对称加密需要协商密钥,而非对称加密可以安全的公开各自的公钥;可以实现N个人之前的通信
5)缺点:运算速度慢,不能够防止中间人攻击。