欢迎各位兄弟 发布技术文章
这里的技术是共享的
TCP/IP: 安全
A-->> B
机密性: 明文传输( ftp, http, smtp, telnet )
完整性: 10 (100) (数据要保证发送的和收到的是一致的)
身份验证: (能够保证对方就是他所声称的那个人)
机密性: plaintext(明文) --> 加密 (转换规则) (转换算法) --> ciphertext (ciphercode)(cipher 密码)(密文)
ciphertext --> 解密 (转换规则) (转换算法) --> plaintext
转换算法: 保证数据机密性的最核心的不是算法本身,而是密钥
(你拿到了ciphertext即使你知道了转换规则,但是没有密钥,还是无法转换成明文)
转换算法本身是复杂的数学原理实现的,一般来讲,设计密码加密的都是数学家,设计一个算法要好长时间,需要考虑诸多因素,需要经过多方的测试,还要考虑20-50年能不能被破解的可能性,还要考虑到计算机的发展速度(考虑20-50年能不能被破解的可能性)
我们把我们的安全性不完全依赖于算法,而是依赖于密钥来实现,因为换一个密钥,比换一个算法,要简单的太多太多
abc --> cde (加密的时候向前两位,解密的时候反向推两位)
对称加密: 算法+密钥 加密传过去 解密的时候密钥是相同的,算法不一定(一般是不可能的?这句话不太懂?)
密钥是相同的,这种加解密方法,叫做对称加密
好处:算法计算速度非常快,但是其安全性几乎完全依赖于密钥,因为很多算法是公开的
劣处:密钥太多,无法有效管理
通信对象很多的情况下,没办法实现不同的密钥的管理
数据完整性: A --> B (数据不能篡改)
Eve监听A与B之间的通信,篡改数据
单向加密算法:提取数据特征码(指纹)
1),输入一样,输出必然一样
2),雪崩效应:输入的微小改变,将会引起结果的巨大改变,这是为了防止密码的暴力破解的
3),定长输出:无论原始数据是多大,结果大小都是相同的
4),不可逆的:无论根据特征码还原原来的数据
A: plaintext:footprint (footprint 脚印,指纹)提取出来,并附加在明文后面 --> B
(使用同样的加密算法,去重复计算这段明文的特征码,并跟原来发过来的
特征码进行比较,如果一样,那么数据就说明没有被篡改)
plaintext是对的,footprint不对,所以不一样
plaintext是不对的,footprint对的,所以不一样
plaintext是不对的,footprint不对,所以不一样
出现以前三种情况, B 就不接受数据
man-in-middle 中间人攻击
A: plaintext:footprint --> B
E: plaintext2:footprint2 -->B E截取A-->B数据,修改明文,计算特征码,发给 B
A: plaintext: (footprint) 加密-> B,对加密的 (footprint) 进行解密,只要能解密,就知道,这个数据,没有被篡改过,因为A的密码只有A和B知道,
E: plaintext2:f(footprint2) 加密 -->B E截取A-->B数据,修改明文,计算特征码,(没法解开加密的特征码,或者说加密使用的密码就不是A与B约定好的密码)发给 B ,B收到后,就知道这段数据被修改过了
协商生成密码: (别人看不懂,只有A和B才能看懂的约定的密码) 密钥交换
双方协商如何生成密钥,但是却能够不让第三方得到这个密钥,密钥交换需要特殊的互联网协议支撑
最早的也是今天被当作密钥交换算法(密钥交换机制)的,叫 Diffie-Hellman 算法( 协议 )
密钥交换 (Internet Key Exchange,IKE) 互联网密钥交换
A --> B
p(大素数,质数,prime,只能被1和自身整除,但是很大),主要是利用了一种数学原理(离散对数原理) (prime 素数)
g(generator 生成数 生成器数),为了帮你生成其它数字的
p和g在互联网上传输,任何其它人都可以看到
A: x x是随机数 A 只知道自己的x,不知道对方的y
B: y y是随机数 B 只知道自己的y,不知道对方的x
x和y不在互联网上传输的
然后双方开始做计算
A 将 g^x%p (g的x次方,对P取模)--> B
B 将 g^y%p (g的y次方,对P取模)--> A
互联网上只能看到四个数 p g g^x%p g^y%p ,看不到x,也看不到y
普通人 无法推断出 x和y是什么
A: (g^y%p)^x = g^yx%p
B: (g^x%p)^y = g^xy%p
g^yx%p = g^xy%p
A和B能够计算出相同的结果,这个结果就是密钥
这就是著名的 Diffie-Hellman 密钥交换算法
可以尝试一下,看结果是不是一样的,结果肯定一样
g=2
p=7
x=2
y=3
A和B从此以后不需要记密码了,只要有一个软件,能够利用 Diffie-Hellman 算法,每一次发送数据,它都重新计算一次,交换一次密钥,就算E把第一次密码破解出来,第二次密码已经换了
2^x * 2^y
(2^x)^y
上面只是讲明白它们到底是如何进行的,事实上背后涉及到的原理比这个要复杂得多
因为密码是自动生成的,所以接收方还是无法验证发送方的身份
公钥加密算法 (非对称加密算法)
密钥对:
公钥: p (public key)
私钥: s (secret key)
公钥不是独立的,公钥是从私钥中提取出来的,为了保证算法的安全性,私钥一般都非常的长,一般768位,(1024,2048,4096,8192)位的都有
用公钥加密的,只能用与之配对的私钥解密,
用私钥签名(加密)的,只能用与之配对的公钥验证(解密),
发送方用自己的私钥签名(加密)数据,可以实现身份验证的
发送方用对方的公钥加密数据,可以保证数据的机密性
公钥加密算法(非对称加密算法)其实很少拿来数据加密的,因为速度太慢了,因为它的密钥太长了
公钥加密算法 (非对称加密算法)比 对称加密算法 要慢上3个数量级(1000倍)
公钥加密(非对称加密算法) 通常是用来身份验证,通常不是用来保证机密性的场合
指纹(特征码) 和 公钥加密算法结合起来,就能保证了 身份验证和完整性
公钥加密算法 (非对称加密算法)的主要作用也就是身份验证
证书要收费,全球认可的证书,一个证书,有可能10万,20万 (一年的使用费)
几千是最便宜的了
以上只能保证 完整性(指纹作用)和身份验证(公钥作用)
要想实现机密性不要用公钥加密算法(因为它太慢),我们使用对称加密
下图不考虑,因为涉及到IKE,太麻烦
下面是正常的做法
PKI: public Key Infrastructure 公钥基础设施
PKI的核心就是证书颁发机构 ( CA )和它的彼此间的信任关系
证书丢了怎么办? 声明作废
我们的这里就是私钥丢了,别人攻破我的服务器,就是丢了
怎么保证私钥丢了,别人却无法用了
(银行U盾又还是需要密码的)
同样,我们的私钥也是需要加密存放的,
私钥加密固然会保护私钥,但是会带来额外的问题:
每次用到私钥加密一段数据,都需要输入密码,
有时我们还需要借助于额外的管理工具,它能够自动输密码的,
既然能自动的,别人攻破了,也就没有意义了
万一工具出了问题,问题就更大了,
比如管理通讯录的软件,人家能拿到你的通讯录
电脑的杀毒软件,有权限扫描电脑,电脑上的数据杀毒公司都可以拿走的,
安全软件才是最大的间谍软件
用一些开源的东西,自己生成密钥(是对私钥加密?),自己管理密码(私钥密码),
然后两人通信,别人是获取不到的