現在的一個需求就是要前端這邊做md5加密,本來想要用crypto,而crypto是node內置的模塊,在npm查了一下,這個包已經沒有了,所以改用crypto-js,這個還是很簡單的。
我們這邊的md5的加密規則如下:
- 將除了sign和appKey以外的,一級請求參數(不包含對象數組等)根據key值按照字母表的順序(a~z)排序,將其對應參數值(僅value,不要key)拼接到一起,得到字符串A
- 拼接 appKey+A+appSecret ,得到字符串B
- 將字符串B 進行urlencode(utf-8)編碼,結果轉化爲大寫,得到字符串C。除了字符、數字、下劃線全部編碼
- 將字符串C 進行MD5編碼,結果轉化爲大寫,得到字符串D
所以可以將這些都寫在一個js裏面,然後引入就好了
// md5.js
/* eslint-disable */
import CryptoJS from 'crypto-js'
// md5 加密
const md5 = str => CryptoJS.MD5(str).toString().toUpperCase()
export const sign = (params, appKey, appSecret) => {
const obj = {}
let str = ''
for (const k in params) {
if (['sign', 'appKey'].includes(k) || k instanceof Array || k instanceof Object || params[k] === undefined) {
continue
}
obj[k] = params[k]
}
Object.keys(obj).sort().forEach(k => {
console.log(k, ': ', obj[k]);
str += obj[k]
})
str = encodeURI(`${ appKey }${ str }${ appSecret }`).toUpperCase()
console.log('str-------------->', str)
return md5(str);
}
// const params = {"restaurantId":"1106073","lat":31.298,"lng":121.448,"channel":"ele"};
// console.log(sign(params, '9381936516', 'D31ba58fd73C71db697ab5E4946D52F'));
用ES6的import 引入調用
// index.js
import { sign as getSign } from './md5'
const appKey = '888888888'
const appSecret = 'sdggdsgcdhdshdhfhhfhdhhhfvc'
const sign = getSign(postDatas, appKey, appSecret)
console.log('sign', sign)