phpmyadmin 如何更改节点管理员散列密码或添加另一个管理员帐户?

qlckcl4x  于 2022-11-09  发布在  PHP
关注(0)|答案(1)|浏览(218)

我有一个node.js应用程序,我的工作,不幸的是一个错误的电子邮件地址被用于管理员帐户,我们不记得密码.
使用的哈希密钥类型为bcrypt。$2a$09$OczLcHx7lZQd1cgbLLmTrewUUx.nwEoZAuDembLxXI00mVEobyQZ6
我想知道是否有办法更改密码或添加一个新的管理员帐户完全。
我为解决管理员登录问题所做的事情。
我尝试过从phpmyadmin MySQL表中修改密码,也尝试过更改管理员电子邮件地址,但nodejs应用程序仍然无法识别这些更改。
这是我的password.js文件

const bcrypt = require("bcryptjs");
const db = require("../models/db");
exports.hashPassword = (password) => {
    return new Promise((resolve, reject) => {
        const newHashPassword = bcrypt.hash(password, 9);
        resolve(newHashPassword)
    })
}

exports.comparePassword = (password, hashPassword) => {
    return new Promise((resolve, reject) => {
        const same = bcrypt.compareSync(password, hashPassword);
        resolve(same)
    })
}

//SAVE RESET PASSWORD TOKEN TO DB
exports.saveResetPasswordIntoDB = (obj) => {
    return new Promise((resolve, reject) => {
        db.query("INSERT INTO f_password_reset_token SET ?", obj, (err, data) => {
            if (err) reject(err)
            else resolve(data)
        })
    })
}

//DELETE USER RESET PASSWORD TOKENs TO DB
exports.deleteResetPasswordByUserId = (userId) => {
    return new Promise((resolve, reject) => {
        db.query("DELETE FROM f_password_reset_token WHERE token_user = ?", parseInt(userId), (err, data) => {
            if (err) reject(err)
            else resolve(data)
        })
    })
}

//DELETE ALL RESET PASSWORD TOKENs TO DB
exports.deleteAllResetPassword = () => {
    return new Promise((resolve, reject) => {
        db.query("DELETE FROM f_password_reset_token", (err, data) => {
            if (err) reject(err)
            else resolve(data)
        })
    })
}

//CHECK IF USER HAS A TOKEN
exports.checkPasswordTokenByUserId = (userId,token) => {
    return new Promise((resolve, reject) => {
        db.query("SELECT * FROM f_password_reset_token WHERE token_user = ? AND token_code = ?", [parseInt(userId), token], (err, data) => {
            if (err) reject(err)
            else resolve(data[0])
        })
    })
}
u4dcyp6a

u4dcyp6a1#

如果它没有在生产中,为什么不暂时覆盖comparePassword函数中的bcrypt.compareSync函数呢?根据npmjsbcrypt.compareSync函数返回true或false,这样就可以快速地修改oneliner,从而绕过密码检查。这不是最好的方法,也不能保证成功。你当然不应该在生产中这样做,但是它可以帮助你避开错误的密码,这样你就可以登录并重置/更改你自己的密码。例如:

exports.comparePassword = (password, hashPassword) => {
    return new Promise((resolve, reject) => {
        const same = true; //bcrypt.compareSync(password, hashPassword);
        resolve(same)
    })
}

同样,这取决于授权流程的其余部分,但从理论上讲,每个有效的密码都是一个匹配的密码。可能你只需要登录,进入你的帐户,更改密码,这样你下次就可以像往常一样登录了。
如果您必须在生产过程中执行此操作,至少要安全一点...我认为变量“password”是明文,因此您可以执行以下操作:

const tmpPwd = [temp_pwd]; // temporary "root" password
const same = tmpPwd === password; // if password === our tmp pwd (we try to login)
if(!same){ // if it's not "we", do regular auth for regular user
   const same = bcrypt.compareSync(password, hashPassword);
}
resolve(same)

注意,你不会是第一个使用这种肮脏伎俩的开发人员,忘记了它,后来发现有一个数据泄露。我工作的大多数泄露都涉及开发人员忘记了一些东西。

相关问题