参考 :
http://www.cnblogs.com/JimmyZhang/archive/2008/10/02/Cryptograph.html
https://blog.csdn.net/Jogger_Ling/article/details/60576625
2 架机器要通信, 信息很容易被窃听或串改, 需要一套加密机制来保证安全.
通信安全需要具备 3 个条件
1. 信息可被拦截,但是不可被解读 (传输中都是乱码)
2. 信息可被串改, 但是接收方可以察觉 (发现被串改了就不处理了)
3. 接收方必须能确认发送方是真实的.
以上就是通信的基本安全. 没办法满足任何一个, 通信就算失败了.
要安全就加密咯,我们来聊聊加密。
这里提到 3 个和加密有关的方法.
1. 对称加密
对称加密很简单.需要这几件东西 :
1. 信息
2. 加密/解密算法 (算法可公开)
3. 密钥 (password) (密钥不可公开)
用程序来表达是这样的
var encrypted_message = encrypt(message, "password");
那解密就是这样
var message = decrypt(encrypted_message , "password");
2. 非对称加密
这个比较特别它有 2 个 password 叫 公钥,私钥
1. 信息
2. 加密/解密算法 (算法可公开)
3. 公钥 (公钥可公开)
4. 私钥 (私钥不可公开)
它的规则比较特别, 如果用公钥来加密,那么解密的时候要用私钥才能解开
var encrypted_message = encrypt(message, "public password");
var message = decrypt(encrypted_message , "private password");
或则反过来, 私钥加密,公钥解密也是可以.
3.散列算法
这个算法不是用来加密解密的, 它只有加密的功能,却没有解密的功能.
1. 信息
2. 算法 (算法可公开)
它的特点是这样的, 不管你的信息量多大, 经过这个算法都会产生出固定长度的字符串.
没有任何一种方法可以把这字符串还原回原本的信息.
另一个特点是, 它生成出来的字符串是唯一的, 如果 "message" 变成 "egassem" 的话,那么你再也找不到任何一个信息能变成 "egassem", 就只有 message 能变成 "egassem".
而且每一次 "message" 就只能变成 "egassem" 不会变成其它的.
你第一次接触的话,可能会很好奇这东西有啥用.
我举个典型的例子. 用户的密码保存.
我们都知道用户在申请的时候回把 username password 告诉网站, 如果网站把 password 直接保存在数据库中是很危险的。
因为如果一不小心数据库被黑掉了, 用户的密码就被公开了,用户虽然使用很多网站但是密码通常都是放一样的,所以一旦密码被公开,那么其所有网站的资料都会变得很危险.
所以一个好的网站是不应该直接把密码存放在数据库中的. 那这时我们就可以使用这种散列算法把密码都变成一堆乱码. 而只要在用户登入的时候把 password 通过算法再次生成出乱码字符串,对比字符串我们依然可以确定用户输入密码的正确性.
p.s 这里只是讲解散列的运用,真正的密码保存除了散列我们还会加入盐 (salt) 的概念,防止彩虹表的攻击, 这里就不展开了.
通信安全就是靠这 3 件法宝来完成的.
发送方先把信息散列化
这时就有 信息 和 散列信息 2 个东西, 等下将一起发送出去.
发送方用接收方的公钥加密信息 (这样信息就只有接收方能解密, 满足了条件 1)
发送方用自己的私钥加密散列信息 (散列信息在传输时可能被拦截者解密, 因为发送方的公钥人人都有,但是它是散列信息, 所以是乱码看不出内容的, 依然满足条件 1)
接收方收到这 2 个信息之后, 先用自己的私钥解密信息, 这时就得到了正确的信息内容. 但是要怎样确定发送人呢 ?
接收方用发送方的公钥去解密 散列信息, 解密之后得到乱码, 这时接收方再拿刚才拿到的正确信息做散列化, 然后对比两个散列信息.
如果内容完全一样,那么我们断定途中没有人串改, 同时也间接证明了刚才接收方用发送方的公钥解密是真确的, 由此我们可以断定发送方的身份, (满足了, 2,3 条件)
所以上面几个关键点就是
1. 散列也能取到保护信息传输的工作, (虽然它不能解密但是可以加密)
2. 散列可以通过对比, 来求证.
3. 公钥私钥很巧妙的让我们可以确认发送方.
那第一种对称加密呢 ? 怎么没派上用场 ?
非对称加密是非常耗时间性能的, 所以 https 只有第一次通信才会使用上面的方式, 而通信的内容就是一个随机的密码.
通信之后只有双方会知道密码,然后之后的通信就用这个密码做对称加密来保护信息.
即使有人拦截串改, 由于不知道密码就伪造不出信息了,拦截者要是随便弄一个信息来,接收方一解密,就会发现解密失败,或则解出来的内容根本是乱码. 因为密码不对嘛
上面说这么多都有一个假设,就是通信的双方都持有对方的公钥.
这个是怎么办到的呢 ? 我的电脑怎么会有某某某网站的公钥 ?
这就是证书的作用了, 有一个很了不起的机构,它有一把私钥,网站管理人员会像这个机构要求它用这个私钥加密一个文件.
然后网站把这个文件放到服务器里头, 这文件就叫证书. 所有的游览器和 os 都拥有这个机构的公钥. 这个是 os 自带的. 这就是电脑为什么会有公钥的由来.
当游览器像某个网站放请求的时候, 网站会返回这个证书和网站自己的公钥. 游览器会用 os 自带的公钥解密证书, 证书如果是用很了不起机构私钥加密的,那么就能解密成功。
这时我们能确定这一次的通信是安全的,我们也就拿到了网站的公钥了. 然后就可以开始上面的步骤了.
大致上是这个概念啦,我是做业务层的,安全这种东西一般上框架都包办了.根本不需要我去担心.
如果你意外读到我的学习笔记,我说的可能很多都是不太正确的哦,自己看着办吧.
p.s 要判断解密是否失败,方式是对比散列, 或则是在解密的过程中通过算法得知(我不确定这是不是可能的, 但对比散列是肯定可以的)
以上.