引言

  最近LZ在公司里接了一个活,要发布一些服务给公司的合作伙伴调用。这种工作LZ可谓是轻车熟路,之前已经做了无数服务端。不过与以往不同的是,这次的服务是要发布在互联网上的,因此不能再像之前的套路一样。之前的系统交互都是公司内网之间的,因此不存在数据安全问题。

  这次不得不考虑数据的安全性,因此LZ最近就苦逼的开始研究各种加密算法。前后一共用了三天时间,LZ终于把加密层做好了,尽管LZ对各种加密算法的原理一概不知,但应该也算够用了。毕竟LZ没打算做一个绝对安全的系统(事实上这也是不可能的),只要能阻止90%的黑客即可。

方案制定

  开始的时候,首先要制定方案,应用层的协议采用http,这点是确定的。对于加密,LZ想来想去,基本上有两种选择。

  第一种是传统的办法,使用自签名证书,借用jdk和web容器的ssl层实现,这种方法比较常用,也比较省事。

  第二种是手动编程的方法,类似于自己写了一层ssl的实现。原理也很简单,对方把数据加密后传给LZ的服务端,LZ这边解密后该怎么处理就怎么处理,完事以后把响应的数据加密传给客户端,客户端解密之后该怎么处理就怎么处理。

  经过一番实验和思考,LZ还是决定采用第二种方法。主要原因是,这种方式更加灵活,加密方案是LZ可以随意更改的(比如把其中的某个算法用别的算法替换)。还有一点原因是,自己写的东西更加容易掌控,如果加密层出现问题,LZ作为PM可以更快的定位问题。最后一点原因是,基于算法而不是基于Java类库,更容易制作各种语言的客户端。

  

代码设计

  方案基本确定,接下来就是代码设计。代码设计分为客户端和服务端,作为客户端,LZ可以提供公用的加密解密组件给合作伙伴调用(比如java客户端,php客户端,.NET客户端等等)。作为服务端,LZ只需要过滤器和定制视图就可以轻易完成加密和解密的工作。

  最终写出来的客户端API如下:

  HttpsHelper.sendJsonAndGetJson(JSONObject json);

  HttpsHelper.sendJsonAndGetJson(JSONObject json,int timeout);

  以上就是客户端组件公布的两个方法,方法的作用很好理解,LZ就不多说了。在方法的实现当中,LZ已经帮客户端完成了加密和解密操作。当然,使用这个客户端的前提是,得到LZ给予的授权码。

  服务端需要一个过滤器和一个定制的json视图。

  SecurityFilter

  JsonView

  由于LZ发布的是restful风格的服务,因此使用的mvc框架是spring mvc。这两个类的具体代码这里就不贴了,总之过滤器完成请求参数的解密,视图完成响应结果的加密。

  

ssl层实现

  以上基本上已经完成了整个加密解密功能的设计,接下来的工作就是将工作落实到实处,到底加密算法如何选择?

  之前LZ对加密解密算法可谓是大大的小白,就知道一个md5算法,一般是用于密码加密的。这下可难倒LZ了,不过没关系,有百度和google,还有什么不能在几天之内学到的东西吗。

  经过一番百度和google,LZ发现算法主要分为以下三种:

  1,不可逆加密算法,比如md5就是这样一种,这种算法一般用于校验,比如校验用户的密码对不对。

  2,对称加密算法,这种算法是可逆的,两边拥有同一个密钥,使用这个密钥可以对数据加密和解密,一般用于数据加密传输。特点是速度快,但安全性相对于非对称加密较低。

  3,非对称加密算法,这种算法依然是可逆的,两边拥有不同的密钥,一个叫公钥,一个叫私钥,两边也都可以对数据加密和解密,一般用于数字签名。特点是速度较慢,但安全性相对于对称加密更高。

  之前LZ听说过ssl的实现是几种算法混合使用的,这给了LZ很大的启示。既然每种算法都有它的优势,我们为何不混合使用呢。

  于是,LZ想来想去(主要是在公车上以及厕所思考),决定使用md5(不可逆加密)+des(对称加密)+rsa(非对称加密)的加密方式,编码格式可以使用Base64。来看看LZ的需求,主要有两点。

  1,客户端需要LZ授权,也就是说LZ发布的服务不是谁想调就能调的。

  2,数据在传输过程中是加密的,并且安全性要等同于非对称加密算法的安全性,但性能要等同于对称加密的速度。

  我们来看看以上的算法实现能否满足需要,过程是这样的。

  1,假设LZ给客户端一个授权码,比如123456。再假设客户端现在需要传的数据是{"name":"xiaolongzuo"}。(请求数据和响应数据都是json格式)

  2,客户端需要先对123456进行md5加密,然后放入到传输数据中。也就是传输的数据会变成{"name":"xiaolongzuo","verifyCode":"md5(123456)"}

  3,客户端生成des的随机密钥(注意,对称密钥每次都是随机生成的),假设是abcdef,客户端使用该密钥对传输数据进行des加密,并且对随机密钥进行rsa加密,最终拼成一个json。也就是最终传输的数据会变成{"privateKey":"rsa(abcdef)","data":"des({"name":"xiaolongzuo","verifyCode":"md5(123456)"})"}

  4,服务端使用相反的过程对数据进行解密即可,并验证解密后的授权码md5(123456)是否存在,如果不存在,则认为该客户端未被授权。当服务端返回数据时,依旧使用abcdef对数据进行des加密即可。

  安全性分析:假设以上的数据被黑客拦截,那么黑客最主要做的就是破解rsa算法的私钥(私钥只有LZ有,客户端组件中会附带公钥),这个问题听说是比较难的,具体为什么,这就不是LZ需要考虑的了,LZ还没这个能力。基于这个前提,LZ可以认为传输的数据还是比较安全的。

  性能分析:由于我们的rsa只对长度比较短的des私钥进行加密,因此非对称加密速度慢的特点并不会影响我们太多。几乎上所有的传输数据,我们都是使用的des进行加密,因此在速度上,几乎等同于对称加密的速度。

小结

  由于源代码是公司所有,因此LZ这里不方便贴出来,但是整个思路这里已经阐述的非常清晰了。

  通过这次的简单学习,也不难发现,带着目的的学习才是最高效率的学习。试想一下,如果LZ只是闲来无事,随便看看加密算法,相信不会在这么短的时间内搞清楚,并且学会一些基础的使用方法。所以事实证明,学习任何知识,最好的办法就是利用这个知识做一个东西出来。

一次ssl的手动实现——加密算法的简单扫荡的更多相关文章

  1. SSL握手两大加密算法 : RAS算法 和 DH算法解析

    写下此博客记录心得体会,如有不足之处请指正   先是手稿笔记 :  正文:   在Https协议中,Client端和Server端需要三个参数才能生成SessionKey来加密信息. 三个参数分别是 ...

  2. RSA加密算法的简单案例

    RSA加密算法是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击. 那关于RSA加密算法有哪些应用呢?以下举一个数据库身份验证的案例. 在使用数据集进行身份认证时,密码存在数据 ...

  3. C#手动回收内存的简单方法

    C#有自动回收内存的机制,但是有时自动回收有一定滞后,需要在变量使用后迅速回收,节约内存,这里介绍一个最简单的方法. 1.先对对象赋值 null; 2.System.GC.Collect(); 代码样 ...

  4. 使用SSL配置Nginx反向代理的简单指南

    反向代理是一个服务器,它接收通过Web发出的请求,即http和https,然后将它们发送到后端服务器(或服务器).后端服务器可以是单个或一组应用服务器,如Tomcat,wildfly或Jenkins等 ...

  5. 《TensorFlow2深度学习》学习笔记(二)手动搭建并测试简单神经网络(附mnist.npz下载方式)

    本实验使用了mnist.npz数据集,可以使用在线方式导入,但是我在下载过程中老是因为网络原因被打断,因此使用离线方式导入,离线包已传至github方便大家下载: https://github.com ...

  6. RSA加密算法c++简单实现

    RSA是一种非对称加密算法,在公开密钥和电子商业中RSA被广泛使用.它是基于一个很简单的数论事实,两个素数相乘很容易,对两素数乘积因式分解很困难.原理就不再阐述了,我谈谈算法的编程实现过程. 一.RS ...

  7. 使用md5加密算法完成简单的登录和注册功能

    原理: 登录:后端controller层获取到客户的密码,通过下面代码:new Sha256Hash(pwd).toHex();将密码转换成md5散列,生成一个新的字符串与数据库的值进行比对,根据不同 ...

  8. 浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议

    node.js的crypto在0.8版本,这个模块的主要功能是加密解密. node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术, 这是因为 ...

  9. SSL / TSL 传输加密算法 初解读

    SSL(SecureSocketLayer)是netscape公司提出的主要用于web的安全通信标准,.TLS(TransportLayerSecurity)是IETF的TLS工作组在SSL3.0基础 ...

随机推荐

  1. 问题解决——Win7 64 安装 AutoCAD 2010 32位 和 清华天河PC CAD

    最近单位组了一台电脑,配置还好,E3大法+R9 280,装了Win7 64位系统. ========================================================== ...

  2. jsp 单机和双击事件

    公司要求给一个按钮加一个双击和单机事件  整理了一下   做个笔记 HTML  单机和双击事件 <a href="javascript:void(0)" ondblclick ...

  3. 虚拟机centos6.5 --设置主机名

    vi /etc/sysconfig/network #修改HOSTNAME后面的值,机器名 vi /etc/hosts #设置ip和机器名的对应关系 192.168.12.232 master 192 ...

  4. poj-1083-Moving Tables(hdu-1050)

    Moving Tables Time Limit: 1000MS Memory Limit: 10000K Total Submissions: Accepted: Description The f ...

  5. SQLConnect_ref.cpp

    // SQLConnect_ref.cpp // compile with: odbc32.lib #include <windows.h> #include <sqlext.h&g ...

  6. 【问题&解决】sql2012安装时卡在正在启动操作系统功能"NetFx3"上不动的解决办法

    安装完windows8 后开始安装sql2012,安装过程中停在“正在启动操作系统功能"NetFx3"”不动了,很是着急,于是上网查了一下资料,原来NetFx3指的是Framewo ...

  7. 我是如何来做网站优化(Seo)的?(二)

    在上一篇文章<我是如何来做网站优化(Seo)的?(一)>讲述了网站优化几个注意项目. 在我们日常网站维护中,难免会使用到各种工具,文章的第二节我们就来讲讲这些工具. 网站提交通道 百度站长 ...

  8. bzoj-2338 2338: [HNOI2011]数矩形(计算几何)

    题目链接: 2338: [HNOI2011]数矩形 Time Limit: 20 Sec  Memory Limit: 128 MB Description Input   Output 题意: 思路 ...

  9. HDU 5057 Argestes and Sequence --树状数组(卡内存)

    题意:给n个数字,每次两种操作: 1.修改第x个数字为y. 2.查询[L,R]区间内第D位为P的数有多少个. 解法:这题当时被卡内存了,后来看了下别人代码发现可以用unsigned short神奇卡过 ...

  10. HDU 1892 See you~

    最裸的二维树状数组,但是因为内存太大(c[1010][1010]),好像不能运行,结果蒙着写,写了好久.. 代码: #include <iostream> #include <cst ...