首页 > 解决方案 > 为什么我的函数返回 unicode 替换字符

问题描述

我正在尝试为密码添加加密,并希望存储哈希并在注册/登录时完成加密/解密,从 utf8 到十六进制的加密很好,但是当我尝试解密时,我得到了一堆看起来像这样的奇怪字母:

"\ufffd'\rF\ufffd\ufffd\¡\ufffd6>\ufffd\ufffd#B,0\u0005\u0007\ufffd?\ufffd;\ufffd\u0018\u001e\"oؕ"

我一直在试图弄清楚它是如何使用错误的编码数据的,因为我在正确的位置有 hex 和 utf8 标签;我也一直在尝试查看其他帖子,但我担心它们会超出我的理解,因为它们应该如何帮助我。

这是我从中导出的第一个文件

var crypto = require("crypto");

    var secretkey = "twinkies";
    var key = {
    encrypt: function(pass){
        var mykey = crypto.createCipher('aes-128-cbc', secretkey);
        var finpass = mykey.update(pass, 'utf8', 'hex');
        finpass += mykey.final('hex');
        return finpass;
    },

    decrypt: function(pass){
        var mykey = crypto.createCipher('aes-128-cbc', secretkey);
        var finpass = mykey.update(pass, 'hex', 'utf8');
        finpass += mykey.final('utf8');
        return finpass;
    }
};

这是使用方法的第二个文件

    app.post("/api/users/create", function(req, res) {
    console.log(req.body.pword);
    var newpass = key.encrypt(req.body.pword);
    var oldpass = key.decrypt(newpass);
    var enddata = {
        Ciphored_password : newpass,
        Deciphored_password : oldpass
    }
    console.log(res.json(enddata));

我使用邮递员来测试我的 localhost api,并输入“bigthonks”作为密码,当它控制台记录 enddata 时 Ciphored_pa​​ssword 看起来像:

982cb6d27f65fbb642c8c7b710e6c349

和解密密码:

"\ufffd'\rF\ufffd\ufffd\¡\ufffd6>\ufffd\ufffd#B,0\u0005\u0007\ufffd?\ufffd;\ufffd\u0018\u001e\"oؕ"

标签: javascriptexpresscryptojs

解决方案


原来我是个白痴......我错过了修复错误的第一步,它正在查看方法名,

var crypto = require("crypto");

var secretkey = "twinkies";
var key = {
encrypt: function(pass){
    var mykey = crypto.createCipher('aes-128-cbc', secretkey);
    var finpass = mykey.update(pass, 'utf8', 'hex');
    finpass += mykey.final('hex');
    return finpass;
},

decrypt: function(pass){
    var mykey = crypto.createCipher('aes-128-cbc', secretkey);
    var finpass = mykey.update(pass, 'hex', 'utf8');
    finpass += mykey.final('utf8');
    return finpass;
}
};

在我的解密方法上,当我为它生成解密器时,我使用 createCipher() 方法而不是 createDecipher() 方法,这对我来说真的很重要。

我通过将解密方法更改为此轻松修复它:

    decrypt: function(pass){
    var mykey = crypto.createDecipher('aes-128-cbc', secretkey);
    var finpass = mykey.update(pass, 'hex', 'utf8');
    finpass += mykey.final('utf8');
    return finpass;
}

现在它可以工作了。


推荐阅读