上周的时候在学习使用uniapp
的时候,突然说到了加密这个问题,然后就动手开始了解了,先说明,我真的只是一个萌新。
首先是加密工具的选择,一开始找了好多,但是都不能很好的实现或者不懂,最后确定下来使用jsencrypt
这个插件。
那么在uniapp
中怎么进行引用呢?一开始我是想着通过路径的方式进行引用的,就像这样:
import '../js/jsencrypt.min.js'
然后报错了,控制台显示如下:
image.png
当时我就懵了,是调用方式错了吗?我又找了下,说是可以通过npm安装jsencrypt,然后我就使用node通过以下命令安装了它:
npm init -y
cnpm i jsencrypt --save
并通过以下方式重新引用:
import JSEncrypt from 'jsencrypt'
注意:我这个时候npm
中jsencrypt
的版本是3.0.0,其他版本在看完本文之后无效请另寻他法或者通过 cnpm i jsencrypt@3.0.0 --save
命令进行安装。
接着依然报错了,我表面笑嘻嘻着表示继续看下,心里当时就[bi][bi][bi]了。
一星期过去了,尝试过各种奇葩的操作,有看到一个rsa.js
的让我觉得那是可以用的,不过找不到官方文档,涉及加密的东西也不敢用,或者我坐井观天了,最后昨天同事给我看了篇文章,说是这个插件使用了 window
对象,然后不管是小程序还是app
中都没有窗口对象的环境,就导致不能用 window
,一用这脚本就会报错,当然里面也提供了方法,以下给出相关代码并提供原文链接(侵删),要注意的是代码插入具体位置根据原文说法在使用严格模式'use strict';
下一行插入:
// 用来替换 navigator
var navigator2 = {
appName: 'Netscape',
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
};
// 用来替换window
var window2 = {
ASN1: null,
Base64: null,
Hex: null,
crypto: null,
href: null
};
//然后请将文中出现的window替换成window2,以及将navigator替换成navigator2
原文:codeCoder-微信小程序中使用RSA算法生成秘钥对
然后页面中引用jsencrypt
的方式不变,重新运行下确实不报错了,那么可以下一步了,我并没有自己去生成公钥和密钥,是叫后端提供给我的,然后这里我也遇到了坑,下面继续说。
说到公钥
和密钥
,它们是这个样子的:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76
xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4
gwQco1KRMDSmXSMkDwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
-----END RSA PRIVATE KEY-----
注意:以上公钥密钥
可直接使用,是从github中直接拿过来的,点击 传送阵 了解。
再说下jsencrypt
的使用方法:
var en = new JSEncrypt()
en.setPublicKey(this.pubkey)
let encrypted = en.encrypt('觉子先生')
console.log('en:'+encrypted)
var de = new JSEncrypt()
de.setPrivateKey(this.privkey)
var uncrypted = de.decrypt(encrypted)
console.log('de:'+uncrypted)
注意:以上 this.pubkey
和 this.privkey
为 data
种设置的公钥和密钥。
那么公钥和密钥是怎么引用的呢,毕竟有很多换行还有头部注释代码,那么是否需要去除换行或者去掉头部注释代码呢?就是下面这个:
image.png
那么答案是头部注释代码是可以保留的,但是注释代码里面的空格必须完整,还有注释代码的字母也不能更改,要不然会报错或者无法加密解密,其外去除和不去除空格都是允许的,但是不空格的话定义公钥密钥得通过反引号(`,就是常规键盘中Tab键上面的那个键)包裹起来,像这样子:
image.png
好了,写到这感觉没啥写了,本文结束。
网友评论