Asroads'Blog 君子不器
Cocos Creator使用jsencrypt本地存储加密(RSA)
发布于: 2020-09-04 更新于: 2024-03-02 分类于: game 阅读次数: 

前面介绍过前端加密的一种方式是AES(对称加密)后面又看到关于加密解密的文章,觉得甚是不错,于是再次尝试一下用非对称加密写一下。这里使用jsencrypt(RSA) 非对称加密的一种思路。

关于对称加密和非对称加密的介绍,这里不再赘述,直接说步骤吧!

步骤

首先我们 生成私钥和公钥

私钥生成:

1
openssl genrsa -out rsa_1024_priv.pem 1024

然后生成公钥:

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

此时我们的本地生成了两个文件

image-20200904161632411

对应的就是我们的私钥和公钥:内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQC8nNKt9lJdwwFKzRp0D2wPtUcXwMj2t8smhUmLvTTiomej11bg
xf75I4zxIq4sjYE8yyzoWXjrJ2dbakDPFlQxH1kC1mVCBrA1HGAJ8EULyVk52Uu3
MbpW5rCPGUh5gqpSCgVuzvO8ij5UxOxgPZMXH/xH/43PcCfTyWQOIliHHwIDAQAB
AoGAZ9/CU5ZN5F9qDcUJZZO8wqXmYlmFFANCuZM8Xt40CwDALUaCDUZd1t3SWFbu
L5E69L08nTXxVyibTogk6yfz8yrxp18ckT8XbtgNor0MFMPxku7Rg14r14ha4fg5
172FjyH5PI0jJfVwKKLl2cUjzHzEuTyHsXLChjWDrplE8/ECQQDt3okMMaxGGPpY
1jKxKDojdio3Bh32A0FoVCXHZQ/K/7pp4qRYfDY28dzv4e+/ZmmpCWEfSLRoebWR
l2bFMkInAkEAyv0oetOYgbj4a+kl6GW9wKcZedNcXX1SiGFRO2Quybj1J4NpheGz
/A570zUXOR13WYiWiMRHiLZcLidtLMtGSQJAMOH2kAb1PEKN0AvUxwtZR0hVTJF5
PsFUg7gnO17NbA45pODqnTSJf6kcmj94IYFOXWqMBv3N9VptscnHWOcHKQJAXpko
WkVuF1Zqf2/CONHhYnz9RGcZ7n/PDLu9rZ38qAnIRkfZz4jl5huh3UYqsnVm/5TG
AqrmY3II94FsQanh8QJAWX+12fOhCY490btr0nvlReroyci1obEm/73NHZIKSW8l
U5bkherW3VXhwjdQHiDlN4EJTe3HooCA2Qa7Zu21CA==
-----END RSA PRIVATE KEY-----
1
2
3
4
5
6
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8nNKt9lJdwwFKzRp0D2wPtUcX
wMj2t8smhUmLvTTiomej11bgxf75I4zxIq4sjYE8yyzoWXjrJ2dbakDPFlQxH1kC
1mVCBrA1HGAJ8EULyVk52Uu3MbpW5rCPGUh5gqpSCgVuzvO8ij5UxOxgPZMXH/xH
/43PcCfTyWQOIliHHwIDAQAB
-----END PUBLIC KEY-----

这里我们把下载好的 文件 jsencrypt.js 或者 jsencrypt.min.js 任意一个 复制到项目

image-20200904170304784

assets 下的 libs(自己新建)下 顺便把 声明文件 拷贝过去 (文件名字保持一致)可以把

改名 为 JSEncrypt.d.ts修改为 jsencrypt.d.ts

image-20200904171618152

效果如下:

image-20200904172019485

注意:我这里没有使用导入为插件 这个功能 大家自己使用的时候特别注意!!

编写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { JSEncrypt } from "../libs/jsencrypt";

const {ccclass, property} = cc._decorator;
@ccclass
export default class Helloworld extends cc.Component {

@property(cc.Label)
label: cc.Label = null;

@property
text: string = 'hello';

start() {
// init logic
const PRIVATE_KEY = `-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQC8nNKt9lJdwwFKzRp0D2wPtUcXwMj2t8smhUmLvTTiomej11bg
xf75I4zxIq4sjYE8yyzoWXjrJ2dbakDPFlQxH1kC1mVCBrA1HGAJ8EULyVk52Uu3
MbpW5rCPGUh5gqpSCgVuzvO8ij5UxOxgPZMXH/xH/43PcCfTyWQOIliHHwIDAQAB
AoGAZ9/CU5ZN5F9qDcUJZZO8wqXmYlmFFANCuZM8Xt40CwDALUaCDUZd1t3SWFbu
L5E69L08nTXxVyibTogk6yfz8yrxp18ckT8XbtgNor0MFMPxku7Rg14r14ha4fg5
172FjyH5PI0jJfVwKKLl2cUjzHzEuTyHsXLChjWDrplE8/ECQQDt3okMMaxGGPpY
1jKxKDojdio3Bh32A0FoVCXHZQ/K/7pp4qRYfDY28dzv4e+/ZmmpCWEfSLRoebWR
l2bFMkInAkEAyv0oetOYgbj4a+kl6GW9wKcZedNcXX1SiGFRO2Quybj1J4NpheGz
/A570zUXOR13WYiWiMRHiLZcLidtLMtGSQJAMOH2kAb1PEKN0AvUxwtZR0hVTJF5
PsFUg7gnO17NbA45pODqnTSJf6kcmj94IYFOXWqMBv3N9VptscnHWOcHKQJAXpko
WkVuF1Zqf2/CONHhYnz9RGcZ7n/PDLu9rZ38qAnIRkfZz4jl5huh3UYqsnVm/5TG
AqrmY3II94FsQanh8QJAWX+12fOhCY490btr0nvlReroyci1obEm/73NHZIKSW8l
U5bkherW3VXhwjdQHiDlN4EJTe3HooCA2Qa7Zu21CA==
-----END RSA PRIVATE KEY-----`;

const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8nNKt9lJdwwFKzRp0D2wPtUcX
wMj2t8smhUmLvTTiomej11bgxf75I4zxIq4sjYE8yyzoWXjrJ2dbakDPFlQxH1kC
1mVCBrA1HGAJ8EULyVk52Uu3MbpW5rCPGUh5gqpSCgVuzvO8ij5UxOxgPZMXH/xH
/43PcCfTyWQOIliHHwIDAQAB
-----END PUBLIC KEY-----`;

const encryptor = new JSEncrypt({default_key_size:"1024"}); // RSA加密器
encryptor.setPublicKey(PUBLIC_KEY);

const decryptor = new JSEncrypt({default_key_size:"1024"}); // RSA解密器
decryptor.setPrivateKey(PRIVATE_KEY);

let datakey = "user"
let dataString = `abcd1234@@&90`;//要加密的字符串
let encryptedStr = encryptor.encrypt(dataString);
console.log("加密后:", JSON.stringify(encryptedStr));

cc.sys.localStorage.setItem(datakey, encryptedStr);

let cipherText = cc.sys.localStorage.getItem(datakey);//要解密的文本
let dataString2 = decryptor.decrypt(cipherText);//得到解密之后的文本
console.log("解密后:", JSON.stringify(dataString2));
}
}


运行效果

image-20200904172601915

总结

步骤稍显复杂和对称加密相比,优点是安全性更好些,缺点是速度比较慢,不适合快速大量的存储数据,那么有没有更好的方法呢?答案是有的,就是结合前面的对称加密方式,做一个混合加密的策略。

混合加密是结合 对称加密非对称加密 各自优点的一种加密方式。其具体的实现思路是先使用 对称加密算法 对数据进行加密,然后使用非对称加密算法对 对称加密的密钥 进行非对称加密,之后再把加密后的密钥和加密后的数据发送给接收方。

参考

--- 本文结束 The End ---