js對資料進行加密
阿新 • • 發佈:2022-04-08
JavaScript對資料進行加密
1.md5方式加密
每次生成的值是一樣的,一些網站可以破解,因為每次儲存的都是一樣的值
不可逆(法從密文推出原文)
有可能出現多個原文得到同一個密碼
一種攻擊方法是,攻擊者記錄了一張巨大的密碼庫,預先計算了常用密碼的 hash 值,這樣只需要搜尋 hash 值就能尋找到一個合適的密碼用於登入。這就是被彩虹表攻擊。
解決彩虹表的問題是加鹽,在加密之前,對原文混入其他資訊,混入的資訊不存放到資料庫中。實際尋找到其他原文也無法登入。
加密:
import * as md5 from 'md5'; const passwrod = '123456'; const transP = md5(passwrod); 固定值:e10adc3949ba59abbe56e057f20f883e
加鹽加密:
const passwrod = '123456';
const salt = 'dmxys'
const transP = md5(passwrod + salt); 固定值:4e6a2881e83262a72f6c70f48f3e8022
驗證密碼:先加密,再驗證
const passwrod = '123456';
const databasePassword = 'e10adc3949ba59abbe56e057f20f883e'
if (md5(passwrod) === databasePassword ) {
console.log('密碼通過');
}
2.bcriptjs方式加密
每一次 HASH 出來的值不一樣
不可逆
計算非常緩慢
同一種明文(plaintext),每次加密後的密文都不一樣,而且不可反向破解生成明文,破解難度很大。
因此使用 Bcrypt 進行加密後,攻擊者想要使用算出 M2 成本變得不可接受。但代價是應用自身也會效能受到影響,不過登入行為並不是隨時在發生,因此能夠忍受。對於攻擊者來說,需要不斷計算,讓攻擊變得不太可能。
加密:
const bcryptjs = require('bcryptjs') // 匯入bcryptjs包 const passwrod = '123456'; // 初始密碼 const salt = bcrypt.genSaltSync(10); // 生成鹽 const transformPass = bcryptjs.hashSync(password, salt) // 生成加密密碼
快速生成hash值:
const transformPass = bcryptjs.hashSync("123456", 10) // 快速生成加密密碼
密碼驗證:
bcrypt.compareSync("123456", transformPass); // true
bcrypt.compareSync("cuowumima", transformPass); // false
推薦使用bcryptjs,演算法要比md5高階