前言 大家都知道,Javascript是单线程、顺序执行的,通过事件循环来处理异步。而且稍有开发经验的同学也知道,利用setTimeout、setInterval以及Promise可以延时代码的执行。
顺晟科技
2021-06-16 10:58:14
204
a场景是现有的几个项目,微信企业号是PHP,广告数据处理平台是Python,其中的应用程序接口部分是NodeJS。现在这几个应用之间要传递数据,基于安全考虑先用俄歇电子能谱加密,接收后做解密处理。本来预想是一个很简单的工作,库都是现成的,但发现网上的代码要么是不全,要么是填料处理不一致,所以最后还是自己看文档来写的,分享其中的核心代码,有类似需求可以直接拿去用。
俄歇电子能谱
俄歇电子能谱的介绍可以参看Wikipedia:加密标准。这种加密方式需要指定键(密钥)和四(初始化向量),解密时使用同样的钥匙和静脉的进行解密。其次需要填充(填充字符),网上一些代码是用空格或者大括号做填充,解密后再用rstrip/rtrim/replace清掉,但用标准的PKCS会更好。
使用256位的AES,Python会根据传入的钥匙长度自动选择,在PHP5在外链里是MCRYPT_RIJNDAEL_128,Nodejs/PHP7.1是aes-256-cbc。
使用俄歇电子能谱的加拿大广播公司模式,因为英国板球理事会模式用不到四。
使用PKCS的方式来填充,因为开发的库在自动填充(_ p)的状态下使用的也是PKCS。钥匙用aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa个,256位),四用aaaaaaaaaaaaaaaaaaaaaa(16个,128位)。
计算机编程语言使用pycrypto(pip install pycrypto),NodeJS使用加密(npm安装加密),PHP需要外链模块。
计算机编程语言
计算机编程语言
一
2
3
四
5
6
七
8
9
10
11
12
13
14
15
16
17
18
19
来自加密。密码导入俄歇电子能谱
导入base64
def _ pad :返回s(AES。block _ size-len % AES。block _ size)* chr(AES。block _ size-len % AES。块大小)
def _cipher():
key=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa '
iv=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa '
返回AES.new(key=key,mode=AES .MODE_CBC,IV=iv)
def encrypt_token(数据):
return _密文().加密(_pad(数据))
def decrypt_token(数据):
return _密文().解密(数据)
if __name__=='__main__':
打印(' Python加密: ' base64。b64编码(encrypt _ token(' dmyz。org’))
print(' Python decrypt : ' decrypt _ token(base64。b 64解密(' FSfhJ/gk3iejopvlyfvc 2q='='))
Javascript(NodeJS)
Java脚本语言
一
2
3
四
5
6
七
8
9
10
11
12
13
14
15
16
17
18
var crypto=require('crypto '),
key=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
iv=' AAAAAAAAAAAAAAAAAAAA
函数encrypt_token(数据){
var cipher=crypto。CreateCipheriv(' AES-256-CBC ',密钥,iv);
cipher.update(数据,“二进制”,“base64”);
返回密码。final(' base64 ');
}
函数decrypt_token(数据){
var decrypt=crypto。createdecidepheriv(' AES-256-CBC ',密钥,iv);
宣布。update(数据,' base64 ',' binary ');
返回声明。final(' binary ');
}
控制台。log(' NodeJS encrypt : ',encrypt _ token(' dmyz。org’);
控制台。log(' NodeJS decrypt : ',decrypt _ token(' FSfhj/gk3iejopvlyfvc 2q='=');
Java脚本语言
一
2
3
四
5
6
七
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//NodeJS v 0.8 https://github。com/joyent/node/wiki/Api-changes-介于-v 0.8和-v 0.10之间
var crypto=require('crypto '),
key=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
iv=' AAAAAAAAAAAAAAAAAAAA
函数encrypt_token(数据){
var encrypt=crypto。CreateCipheriv(' AES-256-CBC ',密钥,iv),
buffer=Buffer.concat([
encipher.update(数据),
encipher.final()
]);
返回缓冲区。ToString(' base64 ');
}
函数decrypt_token(数据){
var decrypt=crypto。createdecidepheriv(' AES-256-CBC ',密钥,iv),
buffer=Buffer.concat([
解密。更新(缓冲区。自(数据,' base64 ')),
decipher.final()
]);
返回缓冲区。ToString();
}
控制台。log(' NodeJS encrypt : ',encrypt _ token(' dmyz。org’);
控制台。log(' NodeJS decrypt : ',decrypt _ token(' FSfhj/gk3iejopvlyfvc 2q='=');
服务器端编程语言(专业超文本预处理器的缩写)
服务器端编程语言(专业超文本预处理器的缩写)
一
2
3
四
5
6
七
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
?服务器端编程语言(专业超文本预处理器的缩写)
俄歇电子能谱类
{
var $ key=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ';
var $ iv=' AAAAAAAAAAAAAAAA
函数Encryptoken($ data)
{
$ padding=16-(strlen($ data)% 16);
$数据. str_repeat(chr($padding),$ padding);
返回MCRYPT _ encrypt(MCRYPT _ RIJNDAEL _ 128,$this-key,$data,MCRYPT_MODE_CBC,$ this-iv);
}
函数decrytoken($ data)
{
$ data=MCRYPT _ decrypt(MCRYPT _ RIJndael _ 128,$this-key,base64_decode($data),MCRYPT_MODE_CBC,$ this-iv);
$ padding=order($ data[strlen($ data)-1]);
返回substr($data,0,-$ padding);
}
}
if (php_sapi_name()==='cli ')
{
$ AES=新AES();
echo(' PHP encrypt : '。base64 _ encode($ AES-Encryptoken(' dmyz。org '))).\ n ';
echo ('PHP decrypt: ' .$ AES-decrytoken(' FSfhj/Gk3ieJopvlyfvc 2q==')。\ n ';
}
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06