写点什么

一篇学会 RSA JavaScript 加密,涉及 OpenSSL

用户头像
梁龙先森
关注
发布于: 2021 年 02 月 23 日
一篇学会RSA JavaScript加密,涉及OpenSSL

RSA 加密是一种数据加密算法,广泛用于电子商业中,并且 RSA 算法是一种非对称加密算法。何为非对称算法呢?首先我们来了解下对称加密和非对称加密的概念。

对称加密

原文经过一把钥匙(密钥)加密后变成了密文,然后将密文传递给接收方,接收方再用这把钥匙(秘钥)解开密文。在这个过程中,其实加密和解密都是使用同一把钥匙,这种加密方式成为对称加密。

非对称加密

而非对称加密就是和对称加密相对,加密用的钥匙和解密所用的钥匙,并不是同一把钥匙。非对称加密首先会创建两把钥匙,而这两把钥匙是成对的分别称为公钥和私钥。在进行加密时我们使用公钥进行加密,而在解密的时候就必须要使用私钥才能进行解密,这就是非对称加密算法。

加密总结

  1. 对称加密由于使用了相同的秘钥,所以加解密快。但其秘钥需要在网络中传送,所以不大安全。

  2. 非对称加密使用的是秘钥对,即公钥、私钥。且知道其中一方,并不能破解出另一方,所以安全性高。但加解密耗时,速度慢。

  3. 解决的方法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。这也是 https 数据传输采用的方式。


了解了对称加密和非对称加密的概念,那 JavaScript 中如何实现非对称加密呢?下面看看解决方案

JSEncrypt 框架

当浏览互联网寻找 rsajavascript 加密的好解决方案时,有大量的库基本上采用了Tom Wu@http://www cs students.stanford.edu/~tjw/jsbn/然后修改代码来做他们想做的事。但是,我找不到的是这个库的简单包装器,它基本上使用的是几乎没有接触过的库,但是添加了一个包装器来解析 OpenSSL 生成的实际私钥和公钥对。


上面这段话是 npm 中对该库的描述,下面看看如何使用,以及如何搭建 OpenSSL 环境创建公钥秘钥。

1. 用法
  1. 安装依赖

npm install jsencrypt --S
复制代码
  1. 编写加解密工具方法

import JSEncrypt from 'jsencrypt/bin/jsencrypt'
// 公钥const publicKey = '' // 私钥const privateKey = ''
// 加密export function encrypt(txt) { const encryptor = new JSEncrypt() encryptor.setPublicKey(publicKey) // 设置公钥 return encryptor.encrypt(txt) // 对数据进行加密}
// 解密export function decrypt(txt) { const encryptor = new JSEncrypt() encryptor.setPrivateKey(privateKey) // 设置私钥 return encryptor.decrypt(txt) // 对数据进行解密}

复制代码
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 安装方法。

  1. 下载地址:win32/64_OpenSSL.exe下载地址

  2. 下载完成了,直接运行安装,点击 next 直至安装完成。这里要注意的是倘若 OpenSSL 安装路径的 bin 没有自动加入到操作系统的系统环境变量 path 中时,要手动去添加,路径例如:D:\OpenSSL-Win64\bin

  3. 直接 cmd 开启命令行窗口,然后输入运行指令:openssl,无报错,则安装成功

倘若报错:WARNING: can't open config file: /usr/local/ssl/openssl.cnf,则在当前窗口执行命令:

set OPENSSL_CONF=D:\OpenSSL-Win64\bin\openssl.cfg (路径为改为自己安装路径)

3. 生成秘钥对
  1. 生成私钥

openssl genrsa -out rsa_1024_priv.pem 1024

  1. 查看私钥

cat rsa_1024_priv.pem

  1. 根据私钥生成公钥

openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem

  1. 查看公钥

cat rsa_1024_pub.pem


这里生成的 rsa_1024_priv.pemrsa_1024_pub.pem 两文件对应的是私钥和秘钥,使用此秘钥对就能实现 RSA JavaScript 的加密了。

5. 扩展

openssl 同时还可以实现对称加密、单向加密、生成密码、生成随机数、创建 CA 和申请证书,感兴趣的可以自行去了解。这里举个对称加密的例子:

对称加密需使用标准命令 enc,用法如下:

openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64]       [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md]       [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
复制代码

常用选项有:

-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 环境自主生成秘钥对。


发布于: 2021 年 02 月 23 日阅读数: 23
用户头像

梁龙先森

关注

脚踏V8引擎的无情写作机器 2018.03.17 加入

还未添加个人简介

评论

发布
暂无评论
一篇学会RSA JavaScript加密,涉及OpenSSL