alitajs / autils

Awesome frontend utils library
https://alitajs.github.io/autils
17 stars 1 forks source link

3DES加密 #2

Open xiaohuoni opened 4 years ago

xiaohuoni commented 4 years ago

crypto-js 官网找不到用例,自己试了试,最后得出以下正确代码。

对密码明文先进行 base64 加密,如密码 22 加之后 MjI= 然后对加密后的密文进行 3DES 加密,密码:123456789012345678901234 ,偏移量: 12345678 ,得到最后密文 1DKCnPsI/FQ=

import CryptoJS from 'crypto-js';

function encode3DES(psw: string): string {
  const edsKey = '123456789012345678901234'; // 密码
  const edsIv = '12345678'; // 偏移量
  const str = CryptoJS.enc.Utf8.parse(psw);
  const baseStr = CryptoJS.enc.Base64.stringify(str);
  const KeyHex = CryptoJS.enc.Utf8.parse(edsKey);
  const baseStrUtf = CryptoJS.enc.Utf8.parse(baseStr);
  const encrypted = CryptoJS.TripleDES.encrypt(baseStrUtf,
    KeyHex,
    {
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
      iv: CryptoJS.enc.Utf8.parse(edsIv)
    });
  return encrypted.toString();
}
wangxingkang commented 4 years ago

需要这个仓库做什么吗

xiaohuoni commented 4 years ago

我的想法是 能不能像描述需求一样,描述代码。

对密码明文先进行 base64 加密,如密码 22 加之后 MjI=
然后对加密后的密文进行 3DES 加密,密码:123456789012345678901234 ,偏移量: 12345678 ,得到最后密文 1DKCnPsI/FQ=
const str = '22';
const psw = do(str).base64().3DES().offetset('12345678')
log(psw) // 1DKCnPsI/FQ=
wangxingkang commented 4 years ago

我觉得可以这样 每个功能单独 提供 再封装一下 可以链式调用?

imhele commented 4 years ago

头一回见先把字符串 base64 编码再用的,如果没有乱码问题而且源数据也不是二进制一般不需要额外编码一次。 主要是编码麻烦,可以给每个加密函数添加一个 from 属性,把类似

CryptoJS.TripleDES.encrypt(CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(psw)), CryptoJS.enc.Utf8.parse(edsKey));

这种的改成

CryptoJS.TripleDES.encrypt.from([psw, 'base64', 'utf8'], [edsKey, null, 'utf8']);
// 输入的内容可以是 ArrayBuffer 或者字符串,字符串默认 utf8 ,等价于
CryptoJS.TripleDES.encrypt.from([psw, 'base64'], edsKey);

内部数据全部采用 ArrayBuffer ,字符串不方便编码来编码去的。

imhele commented 4 years ago

配置项改造比较简单,类似这种的:

CryptoJS.TripleDES.encrypt(baseStrUtf, KeyHex, {
  mode: CryptoJS.mode.CBC,
  padding: CryptoJS.pad.Pkcs7,
  iv: CryptoJS.enc.Utf8.parse(edsIv)
});

维持一个内部对象,或者用 class 做成这样用:

CryptoJS.TripleDES.encrypt(baseStrUtf, KeyHex).mode('CBC').padding('Pkcs7').iv(edsIv).toString();
xiaohuoni commented 4 years ago

不是头一次见XXXX操作,是前后端同步协定的,加密操作步骤,这个步骤在实际应用中,应该是一个随机状态

imhele commented 4 years ago

不是头一次见XXXX操作,是前后端同步协定的,加密操作步骤,这个步骤在实际应用中,应该是一个随机状态

嗯嗯,可以有但不方便做到链式调用里面,

imhele commented 4 years ago

手残