一篇学会 RSA JavaScript 加密,涉及 OpenSSL
RSA 加密是一种数据加密算法,广泛用于电子商业中,并且 RSA 算法是一种非对称加密算法。何为非对称算法呢?首先我们来了解下对称加密和非对称加密的概念。
对称加密
原文经过一把钥匙(密钥)加密后变成了密文,然后将密文传递给接收方,接收方再用这把钥匙(秘钥)解开密文。在这个过程中,其实加密和解密都是使用同一把钥匙,这种加密方式成为对称加密。
非对称加密
而非对称加密就是和对称加密相对,加密用的钥匙和解密所用的钥匙,并不是同一把钥匙。非对称加密首先会创建两把钥匙,而这两把钥匙是成对的分别称为公钥和私钥。在进行加密时我们使用公钥进行加密,而在解密的时候就必须要使用私钥才能进行解密,这就是非对称加密算法。
加密总结
对称加密由于使用了相同的秘钥,所以加解密快。但其秘钥需要在网络中传送,所以不大安全。
非对称加密使用的是秘钥对,即公钥、私钥。且知道其中一方,并不能破解出另一方,所以安全性高。但加解密耗时,速度慢。
解决的方法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。这也是 https 数据传输采用的方式。
了解了对称加密和非对称加密的概念,那 JavaScript 中如何实现非对称加密呢?下面看看解决方案
JSEncrypt 框架
当浏览互联网寻找 rsajavascript 加密的好解决方案时,有大量的库基本上采用了Tom Wu@http://www cs students.stanford.edu/~tjw/jsbn/
然后修改代码来做他们想做的事。但是,我找不到的是这个库的简单包装器,它基本上使用的是几乎没有接触过的库,但是添加了一个包装器来解析 OpenSSL 生成的实际私钥和公钥对。
上面这段话是 npm 中对该库的描述,下面看看如何使用,以及如何搭建 OpenSSL 环境创建公钥秘钥。
1. 用法
安装依赖
编写加解密工具方法
2. 秘钥对生成
简单点生成秘钥对,可借助现成的一些网站生成,比如:http://web.chacuo.net/netrsakeypair
当然我们这里玩点新鲜的,借助 OpenSSL 自己创建秘钥对,下面小节介绍。
OpenSSL
1. OpenSSL 是什么?
SSL 是 Secure Sockets Layer(安全套接层协议)的缩写。
在计算机网络上,OpenSSL 是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
SSL 能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL 协议要求建立在可靠的传输层协议(TCP)之上。SSL 协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET 等)能透明地建立于 SSL 协议之上。SSL 协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
SSL 是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。
OpenSSL 采用 C 语言作为开发语言,这使得 OpenSSL 具有优秀的跨平台性。
OpenSSL 整个软件包大概可以分成三个主要的功能部分:SSL 协议库、应用程序以及密码算法库(对称加密,如 AES,非对称加密)。
OpenSSL 一共实现了 4 种非对称加密算法,包括 DH 算法、RSA 算法、DSA 算法和椭圆曲线算法(EC)。DH 算法一般用于密钥交换。RSA 算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA 算法则一般只用于数字签名。
OpenSSL 实现了 5 种信息摘要算法,分别是 MD2、MD5、MDC2、SHA(SHA1)和 RIPEMD。SHA 算法事实上包括了 SHA 和 SHA1 两种信息摘要算法。此外,OpenSSL 还实现了 DSS 标准中规定的两种信息摘要算法 DSS 和 DSS1。
OpenSSL 其组成主要包括 3 个组件:
openssl:多用途的命令行工具
libcrypto:加密算法库
libssl:加密模块应用库,实现了 ssl 和 tls
下面看看如何在 window10 上搭建 OpenSSL 环境,并验证基本功能。
2. 搭建 OpenSSL 环境
OpenSSL 环境的搭建,网上找了很多教程,大多是要求去下载 OpenSSL 源码,然后用 VS 进行编译,但是看了那么长的编译步骤,太累人,因此找了个 exe 安装方法。
下载完成了,直接运行安装,点击 next 直至安装完成。这里要注意的是倘若 OpenSSL 安装路径的 bin 没有自动加入到操作系统的系统环境变量 path 中时,要手动去添加,路径例如:
D:\OpenSSL-Win64\bin
直接 cmd 开启命令行窗口,然后输入运行指令:openssl,无报错,则安装成功
倘若报错:WARNING: can't open config file: /usr/local/ssl/openssl.cnf,则在当前窗口执行命令:
set OPENSSL_CONF=D:\OpenSSL-Win64\bin\openssl.cfg
(路径为改为自己安装路径)
3. 生成秘钥对
生成私钥
openssl genrsa -out rsa_1024_priv.pem 1024
查看私钥
cat rsa_1024_priv.pem
根据私钥生成公钥
openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem
查看公钥
cat rsa_1024_pub.pem
这里生成的 rsa_1024_priv.pem
和 rsa_1024_pub.pem
两文件对应的是私钥和秘钥,使用此秘钥对就能实现 RSA JavaScript 的加密了。
5. 扩展
openssl 同时还可以实现对称加密、单向加密、生成密码、生成随机数、创建 CA 和申请证书,感兴趣的可以自行去了解。这里举个对称加密的例子:
对称加密需使用标准命令 enc,用法如下:
常用选项有:
-in filename:指定要加密的文件存放路径
-out filename:指定加密后的文件存放路径
-salt:自动插入一个随机数作为文件内容加密,默认选项
-e:可以指明一种加密算法,若不指的话将使用默认加密算法
-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
-a/-base64:使用-base64 位编码格式
示例: 加密:
openssl enc -e -des3 -a -salt -in fstab -out jiami
解密:
openssl enc -d -des3 -a -salt -in fstab -out jiami
总结
至此我们学习了对称加密和非对称加密的区别,在 JavaScript 如何实现非对称加密,以及如何通过搭建 OpenSSL 环境自主生成秘钥对。
版权声明: 本文为 InfoQ 作者【梁龙先森】的原创文章。
原文链接:【http://xie.infoq.cn/article/c87c2de30ab69cb2b97005d46】。文章转载请联系作者。
评论