Node.js密碼加密

使用crypto庫對密碼進行加密

加密過程使用了node.js原生庫cryptonode

  • utils/crypto.js
const crypto = require('crypto')

// 密匙
const SECRET_KEY = 'WJiol_8776#' // 密匙是自定的,但須要保存好

// md5 加密
function md5(content) {
    let md5 = crypto.createHash('md5')
    return md5.update(content).digest('hex') // 把輸出編程16進制的格式
}

// 加密函數
function genPassword(password) {
    const str = `password=${password}&key=${SECRET_KEY}` // 拼接方式是自定的,只要包含密匙便可
    return md5(str)
}

module.exports = {
    genPassword
}
複製代碼

註冊時將加密後的密碼存到數據庫中

註冊新用戶時使用上面utils/crypto.js中的genPassword方法對密碼進行加密,而後存到數據庫中。 存儲完成後,數據庫中user表的格式和下面類似: mysql

登錄驗證

用戶登錄時,將用戶輸入的密碼加密後和數據庫中已加密的密碼進行比對,一致則代表用戶輸入的密碼正確。sql

const { exec, escape } = require('../db/mysql')
const { genPassword } = require('../utils/cryp')

const login = (username, password) => {
    // In order to avoid SQL Injection attacks, you should always escape
    // any user provided data before using it inside a SQL query. 
    // 避免SQL語句注入攻擊,原理是插入一些特殊字符,讓攻擊片斷失效
    // You can do so using the mysql.escape(), 
    username = escape(username)
    
    // 生成加密密碼
    password = genPassword(password)
    password = escape(password)

    const sql = ` select username, realname from users where username=${username} and password=${password} `
    // console.log('sql is', sql)
    return exec(sql).then(rows => {
        return rows[0] || {}
    })
}

module.exports = {
    login
}
複製代碼
相關文章
相關標籤/搜索