nodejs-crypto 加密工具
crypto 模塊提供了加密功能,包括對 OpenSSL 的哈希、MD5、HMAC、加密、解密、簽名、以及驗證功能的一整套封裝。
crypto 常用的MD5
MD5 是一種不可逆的加密算法,目前是最牢靠的加密算法之一,尚沒有能夠逆運(yùn)算的程序被開發(fā)出來,它對應(yīng)任何字符串都可以加密成一段唯一的固定長度的代碼。
首先,它不可逆,沒有系統(tǒng)的方法可以知道MD5碼原來的文字是什么。
當(dāng)然MD5也是優(yōu)缺點(diǎn)的加密相同的字符是結(jié)果都是相同的碼,會出現(xiàn)撞庫的風(fēng)險。
crypto 導(dǎo)入安裝
對于nodejs 環(huán)境下
npm i crypto --save-dev
//js中引入
const crypto = require('crypto');
或者
import crypto from 'crypto';
封裝一下 MD5 utils.js
const crypto = require('crypto');
/**
* hash方法
*
* @param {String} e.g.: 'md5', 'sha1'
* @param {String|Buffer} s
* @param {String} [format] 'hex','base64'. default is 'hex'.
* @return {String} 編碼值
* @private
*/
const hash = (method, s, format) => {
var sum = crypto.createHash(method);
var isBuffer = Buffer.isBuffer(s);
if(!isBuffer && typeof s === 'object') {
s = JSON.stringify(sortObject(s));
}
sum.update(s, isBuffer ? 'binary' : 'utf8');
return sum.digest(format || 'hex');
};
/**
- md5 編碼
- 3. @param {String|Buffer} s
- @param {String} [format] 'hex','base64'. default is 'hex'.
- @return {String} md5 hash string
- @public
*/
const md5 = (s, format) => {
return hash('md5', s, format);
};
module.exports = {
md5
};
MD5 加鹽并且去除鹽校驗
江湖險惡為了防止撞庫的梅超瘋招式,我們登錄時使用加鹽的方式經(jīng)登陸
用戶注冊時候 MD5 多次加密
md5(md5(用戶名+ md5(密碼))
多次加密,越多越好
//引入上述封裝的utils.js
import utils from '../utils.js'
let name = 'abcd'
let password = '123'
let user_ticket = utils.md5(utils.md5(name + utils.md5(password)))
console.log(user_ticket) => 3a59492a85438a3a39a30fd0d8103ac5 //加密后的結(jié)果
登錄密碼MD5加鹽
加鹽的方式采用時間戳的方式,也可以采用其他方式越咸越好,然后在鍋中來回翻炒
image
好了嚴(yán)規(guī)正傳
同樣采用MD5多次加密規(guī)格另外在加一 時間戳鹽,登錄的時候時間戳也要和其他參數(shù)一并傳入后臺,做解密處理
let name = 'abcd'
let password = '123'
var timestamp = Date.parse(new Date()) / 1000
let user_ticket = utils.md5(utils.md5(utils.md5(name + utils.md5(password))) + timestamp)
console.log(user_ticket) =>0b3298cb3c20b08318c185aec803a929 //加鹽的結(jié)果
加鹽解密
上述說到注冊時采用MD5多次加密保存數(shù)據(jù),登錄時使用MD5多次加密在加鹽
let name = 'abcd'
let password = '123'
var timestamp = Date.parse(new Date()) / 1000
let load_password = utils.md5(utils.md5(name + utils.md5(password))) //儲存密碼
let user_ticket_client = utils.md5(utils.md5(utils.md5(name + utils.md5(password))) + timestamp) //客戶端密碼
let user_ticket_service = utils.md5(load_password + timestamp) //服務(wù)端再次加密計算 儲存密碼加 時間戳
console.log(user_ticket_client == user_ticket_service) => true //客戶端已經(jīng)加密和服務(wù)端再次加密做對比
有人的地方就有江湖,江湖險惡沒有絕對的安全系統(tǒng),還有各式各樣的加密方式,這次帶我MD5拯救江湖,江湖有緣再見