背景交代
我使用的 react 进行开发,请求数据时,需要把一些常用参数放到 header 中传给服务端,但是由于以前老接口定义的规则,因此需要也这么干。 ###使用的加密库
我使用是cryptos-js
https://github.com/brix/crypto-js
1 2 3 4 5 6 7 8 9 10 11
| import CryptoJS from "crypto-js";
function encryptByDES(value, key) { if (value == "") return ""; var keyHex = CryptoJS.enc.Utf8.parse(key); var encrypted = CryptoJS.DES.encrypt(value, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }); return encrypted.toString(); }
|
###转换成 16 进制字符串
上面的方法返回的是 base64 的字符串,如果需要 16 进制的字符串,则需要进行转换,由于官网写的太简单,也没找到参数配置来决定输出的字符串类型,因此我手动做了转换。
由于我们是 16 进制,因为这个浪费了三个小时的时间在调查这个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function encryptByDES(value, key, isHex) { if (value == "") return ""; var keyHex = CryptoJS.enc.Utf8.parse(key); var encrypted = CryptoJS.DES.encrypt(value, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }); const result = encrypted.toString();
if (isHex) { // 把base64字符串转成crypto自定义的中间类型 var words = CryptoJS.enc.Base64.parse(result); return CryptoJS.enc.Hex.stringify(words); } else { return result; } }
|
转换的灵感来自源码里面 docs/QuickStartGuide.wiki
但是在 github 上打开这个文件,和下载下来的源码里面的这个文件内容不一样,我是看的下载下来的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <script> var words = CryptoJS.enc.Base64.parse('SGVsbG8sIFdvcmxkIQ=='); var base64 = CryptoJS.enc.Base64.stringify(words);
var words = CryptoJS.enc.Latin1.parse('Hello, World!'); var latin1 = CryptoJS.enc.Latin1.stringify(words);
var words = CryptoJS.enc.Hex.parse('48656c6c6f2c20576f726c6421'); var hex = CryptoJS.enc.Hex.stringify(words);
var words = CryptoJS.enc.Utf8.parse('𤭢'); var utf8 = CryptoJS.enc.Utf8.stringify(words);
var words = CryptoJS.enc.Utf16.parse('Hello, World!'); var utf16 = CryptoJS.enc.Utf16.stringify(words);
var words = CryptoJS.enc.Utf16LE.parse('Hello, World!'); var utf16 = CryptoJS.enc.Utf16LE.stringify(words); </script>
|
参看链接