1. 程式人生 > 其它 >js對資料進行加密

js對資料進行加密

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高階