Node.js密码加密

5,518 阅读1分钟

使用crypto库对密码进行加密

加密过程使用了node.js原生库crypto

  • 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表的格式和下面相似:

登陆验证

用户登陆时,将用户输入的密码加密后和数据库中已加密的密码进行比对,一致则表明用户输入的密码正确。

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
}