nodejs-md5加鹽到解密比對

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拯救江湖,江湖有緣再見

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容