11月02, 2018

前端crypto使用

昨天接到一个需求,是要接入三方的生僻字输入法API。和其他的三方接口相同,同样是先要请求token,然后得到的结果是一串加密的字符串。需要前端这边解密,当然文档告诉了你怎么解密。拿我这个来举例:

数据采用AES加密,加密模式为CBC,填充pkcs5padding,数据块128位,字符集为utf8,输出base64数据。
私钥:key的前16位
偏移量:key的后16位

有一个验证的网站:在线AES加密解密、AES在线加密解密、AES encryption and decryption

类似的需求之前碰到过几次,不过之前的加密模式是ECB,所以又在网上搜索了一下。

其实网上不靠谱的代码还挺多的,比如说这一篇:前端 crypto-js aes 加解密

当然我也不能说他一定是错的,也许他们的场景就是这样的,只是说这个代码并不通用。

目前找到的比较好的文章是JavaScript Crypto-JS 使用手册

ECB的例子还有这个:aesEncrypt-use-Crypto-js

所以我的需求就很容易解决了:

/**
 * 解密字符串
 */
function Decrypt(word) {
  const key = CryptoJS.enc.Utf8.parse(accessKey.slice(0, 16)); // 十六位十六进制数作为密钥,key的前16位
  const iv = CryptoJS.enc.Utf8.parse(accessKey.slice(16)); // 十六位十六进制数作为密钥偏移量,key的后16位
  const bytes = CryptoJS.AES.decrypt(word.toString(), key, {
    iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  const decryptResult = bytes.toString(CryptoJS.enc.Utf8);
  return decryptResult;
}

有人会比较奇怪,文档里面说的是要用pkcs5,那代码里面为什么会是pkcs7。原因是CyptoJS里面并没有提供pkcs5,而且我查了一下资料,说这两个基本上没啥差异。

alt

一些补充

在我们项目里面,还用到了另外一个加密,可能在其他公司也比较常见:jsencrypt

alt

一般公钥都是去发起ajax请求获取的。

吐槽

cryptojs这个库,在IE10下面是有问题的。之前被同事教育了一下,然后被我怼回去了,说:IE10的份额太低,就先不管吧。也是无奈!

最后的最后

其实一般解密是不会放到前端来实现的,因为考虑到安全,很多敏感的信息在前端非常不好。

本文链接:www.my-fe.pub/post/fe-crypto-use.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。