常见的几种数据加密与应用场景

摘要:
我觉得这个问题有点太泛了,所以给他科普了一次常见的数据加密与应用场景的课。实际上这个地方只有一种数据加密是有效的。MD5在用户密码的处理中这是一种非常常见的处理方式(尽管MD5从严格意义上来说并不属于一种加密算法,他是将内容提取样本到一个字符串。但是在登陆场景下这种数据加密方式并不常用。非对称加密这才是正规改用的方式,在服务器上公开公钥。

起因

最近被一个同事问到,在网络交互中,那部分数据需要被加密那一部分不需要被加密。我觉得这个问题有点太泛了,所以给他科普了一次常见的数据加密与应用场景的课。突然间觉得这个还挺有教育意义的。所以我还是吧这个记录一下吧。

啊,年轻犯下的错

当初我们给某个建站平台做手机客户端的时候就没有考虑这些事情,现在想想被攻击实在是太简单了。我们当初做的内容其实根本就没有数据加密的防护,所有的内容都是公开的。尴尬尴尬。

前一段时间的钓鱼Wifi是怎么做的

我想讲明白这件事情,你首先得了解一下DNS究竟是怎么工作的。作为一篇数据加密的文章呢,我就不做太多的DNS的介绍,这类介绍应该很多。简单点说,就是通过URL转换为IP的一个步骤。很多时候,连接网络之后,如果你不特殊设置,会遵循路由给你的推荐设置。比如下图,就是我电脑的截图。

常见的几种数据加密与应用场景第1张

当我访问网络的时候,比如说www.taobao.com那么浏览器会首先查询这个地址的IP是啥。中间的查询过程就不描述了,一般会询问道上图中的10.8.8.8这个服务器中,然后返回淘宝的正确IP地址,然后发起协议,获取网页数据。然后展示出来网页。当然这个是正常情况下,如果DNS告诉你的网址并不是正常的网址,比如说有人写的跟淘宝一毛一样的一个网站你也浑然不知道。如果你在他们网页上输入了账号密码,然后提交的话。实际上就把这个消息发送给了这个网站的制作者,达到了钓鱼的目的。对付小白用户这样肯定是一来一个准,不过大部分人在进入这个系统之后就会发现猫腻了,比如说登陆了很多次,明明账号密码都是对的却登陆不上,进入系统之后发现数据不对,比如说,我之前买的东西居然没有之前订单了。一般人就会警觉可能被钓鱼了。然后修改密码。这样钓到账号密码就已经失效了。

怎么来做一个简单高效,不容易被发现的钓鱼Wifi

怎么叫做个简单呢?就是我不用去架设各式各样的假网站,我可以直接截获真网站的各条网络协议。当然了如果路由器支持这是非常方便的事情。不过我对于这种事情并没有设么研究,咱是一个程序员。咱们考虑的当然是怎么用咱的程序解决这个问题。比如说通过反向代理某些网站,比如说反向代理淘宝。你访问我的代理跟你直接访问淘宝是一样的结果。然后我在我的代理上绑定淘宝的域名。当然了,这样做一般是没有效果的,因为访问淘宝的请求不会到我这边来,因为DNS解析并不是指向我的。但是如果这个路由器是我的,那么,我就可以让访问淘宝的请求指向我。这样一来,我就建设好了一个域名是淘宝内容也是淘宝的代理服务器,我就能拿到你所有的网络请求。这只是一个架构设想,千万别拿来做坏事,咱们只讨论技术。其实就是网络请求的截取,我们也只是简单的讨论这一种还有很多很多请求截获手段,我们就不讨论了。

怎么进行攻击防御

这个命题就变成了

怎么让攻击者拿到你的网络请求,却没有什么用

起因中也介绍了,这是一个跟一个同事讨论引起的帖子,那么,我先贴上他当时回答。他说数据加密就可以了呀。可是数据加密分很多种呀,你觉得那种数据加密在这个场景下会奇效呢?他说MD5、对称加密、非对称加密。实际上这个地方只有一种数据加密是有效的。来,让我们来分析一下哪个是有效的。

MD5

在用户密码的处理中这是一种非常常见的处理方式(尽管MD5从严格意义上来说并不属于一种加密算法,他是将内容提取样本到一个字符串。因为之前在做项目的时候,用户密码都是用这个处理的,所以作者也误认为这是一种加密算法。被多位网友热情指出,尽管他并不是一种加密算法,但是还是把他放到这里吧。因为文章已经写完了。我有懒得改,就这样吧)。但是在登陆场景下这种数据加密方式并不常用。如果使用MD5来进行登录,一般情况需要将用户密码 + 当前时间分钟戳,然后算出一个密文提交给服务器,服务器拿到信息之后,将密码 + 当前时间和当前时间的前后各一分钟算出三个结果。如果客户端提交的数据在三个数据之中,那么就登陆成功,否则就登陆失败。不过这种用法比较局限性。如果你想连用户名都隐去,这种方式是做不到的。

对称加密

首先得了解对称加密是什么,对称加密是加密解密用同一个密钥。前端在加密的时候,你肯定要在前端输出一边明文密钥。那么传送的是什么。找到你的密钥之后,你传送的数据不论是什么都可以直接进行解密。

非对称加密

这才是正规改用的方式,在服务器上公开公钥。客户端、Web页面拿到公钥之后。将内容加密,然后传送给服务器,服务器进行数据解密。这样的话,就算是被人拿到你的信息,也不怕你的数据泄露了。因为没有地方公开私钥,只有服务器自己知道。这样你的账号密码就可以得到有效的保护。

那么加密的时候,我都需要怎么处理呢?

或许你会这么想,如果我数据都要加密那得多累?服务器能够受的了吗?如果只是登陆部分进行加密,那么其他的连接信息怎么保证用户信息不背泄露呢?会不会存在特殊情况呢?这几种加密方式都什么时候会用的到呢?

举个例子

登陆

前面我们已经讲过了,有两种实现方式MD5+时间戳。或者非对称是加密方式。

注册

这个恐怕只能用非对称加密算法了。因为你得让服务器知道账号密码的原始内容,却不能让截获者知道。

其他需要身份认证的协议

一般情况下,我们的身份认证是通过一个Token(其实这个东西不一定存在什么地方,有的时候是放到Body里边的有的时候是放到Cookie的,有时候是放到Head里的,放到什么地方不重要,关键是他的意义)来做的。那么保护好这个Token就非常重要了,因为你的Token一旦被别人抓到了。那么你的消息也就泄露了。其实这个比用户名、密码来的还要更加麻烦一些。因为用户名密码你需要拿到原始明文才算数。但是Token不一样。他直接使用密文也是一样的,因为服务器解密之后会发现你上传来的数据是对的。关于这个,有几种方式来处理来让Token失效,这个一会我们在讲。

其实聊天中也比较常用

其实非对称式加密,聊天的过程中用的更多。你想,你的聊天不希望其他人看到的吧。因为毕竟这个是你的隐私呀。所以一般是两个客户端互持对方公钥,然后发送消息。不过如果传送对象是一个群,你需要发送消息给每个人。如果这个群里边有200个人,那么你需要将内容压缩成200种密文然后发送吗?那也忒费劲了。好在我们还有对称加密,我们可以首先使用非对称加密的方式,将对称加密的密钥发送给个个人,然后将内容通过对称加密加密,然后发送给个个人,让他们用之前的对称加密的密钥解密,就可以完美的解决这个问题。当然了,对于大点的内容也是一样的。因为非对称加密的性能是比不上对称加密的。

日防夜防,家贼难防

其实很多时候,自己人是比较难搞的。比如说密码的问题吧。早期的网站很多时候,账号密码就是明文的(安全意识不强,当然了早期嘛,谁都会犯错)。这个时候运营打开自家数据库。那么所有的账号密码那是一览无余呀。这种时候只能靠运营的节操来保证数据不会被偷了。就算是运营不会自己偷这部分数据。但是你要知道,总有一些黑客能够偷偷溜进服务器,偷了一块数据库。如果你有加密(不可逆加密)的话,就算拿到数据库也是没有什么用的,因为密码那一栏被干掉了。这样保证最起码,账号密码不会同时被盗。话说我的所有账号密码都基本上是一套,一套掉了,基本上全套都得换,这是意见非常恐怖的事情。(因为场景用的多了,难免会有一些你想不到,没有去改的,却给你带来比较严重的后果)

怎么让Token失效

服务器端更换密钥

因为密钥更换了,所以所有的加密使用原来公钥加密的数据都会失效。所以可以达到更换Token的目的。不过这样的确定十分明显,因为你是在同一个时间点上换的,所以所有数据都会失效,然后重新拉取凭证。这个时候服务器压力应该会很大。再一个就是没什么用,因为攻击者可以在失败之后直接获取一个新的有效Token就可以了。

客户端服务器数据协同

就是让服务器跟客户端数据保持时间上的一致性,一般情况下要求保持分钟数据相同就可以了。这样客户端算出来自己的Token + 时间分钟戳的密文,然后发送给服务器。服务器接收到密文不需要解密(因此这种是使用不可逆加密算法更为靠谱),直接算出三个结果 (Token + 当前时间和Token + 当前前后各一分钟的时间)判定用户上传的数据是否属于这三个之一,如果是属于就通过,不属于就不通过。

客户端的每一个Token都是不一样的

客户端(或者Web网页)用自己的Token + 当前的时间戳(假定不会再同一时间上有多个请求,时间戳可以定的单位更小一些或者进行排队)生成一个密文,然后发送给服务器。服务器拿到密文之后解密,获取并验证Token如果Token通过了就看时间戳是不是在上一个时间戳之后。如果不是在上一个时间戳之后,那么就验证失败好了。

后记

可能比较乱这个,我也是想到什么地方,就写到什么地方。欢迎在下方评论。

说明

MD5其实并不能算作是一种加密算法,因为加密算一半要牵扯到解密。MD5是一种摘要算法,就是从大数据块中摘取特征码的一种算法。文中将他作为一种不可逆的加密算法来看待,当然这是不准确的一种说法,望周知

免责声明:文章转载自《常见的几种数据加密与应用场景》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WPF MVVM实现数据增删改查逻辑全流程详细解析demo蓝牙专题(3)——BLE协议栈(链路层Link Layer)*下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS全局添加token

全局添加token var token = sessionStorage.getItem("UserTocken"); if(token){ $.ajaxSetup({ //发送请求前触发 beforeSend: function(xhr) { //可以设置自定义标头 xhr....

Swoole跟thinkphp5结合开发WebSocket在线聊天通讯系统教程

https://cloud.tencent.com/developer/article/1408530 ThinkPHP使用Swoole需要安装 think-swoole Composer包,前提系统已经安装好了Swoole PECL 拓展 tp5的项目根目录下执行composer命令安装think-swoole: composer require top...

python【第五篇】常用模块学习

1.模块 a.定义:本质就是.py结尾的python文件,逻辑上组织python代码,实现某种功能。例:文件名test.py-->模块名test。 b.导入方法:imort moduname                 from mdname import *                 from mdname import name as...

H5与企业微信jssdk集成

一、公众号设置 注册企业微信,在应用与小程序栏目中,设置可信域名,配置公众号菜单。可信域名不得不说下,在最初开发时,认为设置并验证后,微信认证接口会实现跨域请求,其实并没有。所以全在H5端还得配合服务端完成票据获取等操作。 二、开发步骤 资源引入 开发文档地址https://work.weixin.qq.com/api/doc#90001/90144/90...

TCP keepalive长连接心跳保活

比如:客户端与服务端进行握手时,经常无法握手成功,收不到回复; 需要建立保活机制。 1. 服务端Linux服务器新增系统内核参数配置。 在/etc/sysctl.conf文件中再添加如: #允许的持续空闲时长,在TCP保活打开的情况下,最后一次数据交换到TCP发送第一个保活探测包的间隔,即允许的持续空闲时长,或者说每次正常发送心跳的周期,默认值为7200s...

FFMpeg笔记(八) 读取RTP数据时的PTS计算[转载]

结构体struct RTPDemuxContext中有若干时间戳相关的成员,含义如下 timestamp:上一个接收到的RTP时间戳base_timestamp:第一个接收到的RTP时间戳cur_timestamp:未知unwrapped_timestamp:假如rtp时间没有32位溢出的话,当前的rtp时间应该是多少range_start_offset...