我尝试在插入MongoDB之前和之后对值进行加密和解密。我使用mongoose模式并调用get和set方法进行加密和解密。通过调用set方法对数据进行加密,但在从MongoDB检索数据时并不解密。以下是我的模式以及加密和解密方法:
var tempSchema = new Schema({
_id: {type: Schema.ObjectId, auto: true},
name:{type: String},
sample_details:{
_id: false,
objects: [{
object_key:{type: String},
object_value:{type: String, get:decrypt, set:encrypt}
}],
type_params:[{
type_key:{type: String},
type_value:{type: String, get:decrypt, set:encrypt}
}],
test_body:{type: String, get:decrypt, set:encrypt}
}}, {
toObject : {getters: true, setters: true},
toJSON : {getters: true, setters: true}
});
以下是使用的加密和解密方法:
function encrypt(text){
var cipher = crypto.createCipher('aes-256-cbc', secret_key);
var crypted = cipher.update(text,'utf8','hex');
crypted += cipher.final('hex');
return crypted;
}
function decrypt(text){
if (text === null || typeof text === 'undefined') {
return text;
};
var decipher = crypto.createDecipher('aes-256-cbc', secret_key);
var dec = decipher.update(text, 'hex', 'utf8');
dec += decipher.final('utf8');
return dec;
}
如有任何帮助,我们将不胜感激,object_value和type_value在保存到数据库时被加密,但在从数据库检索时未被解密。
2条答案
按热度按时间ohfgkhjo1#
我也遇到过类似的问题,它对我很有效:
1.在Schema中添加“转换为json时使用getters”选项,例如:
new mongoose.Schema({...}, {toJSON: {getters: true}})
1.将mongoose结果Map到json,如下所示:
Products.find({}).then(a => console.log(a.map(p => p.toJSON())))
(说明:似乎mongoose只在转换到json时使用getter,并且默认情况下禁用它。)
hwazgwia2#
我找到了this issue,这可能是您的问题所在。
如果
objects
和type_params
是作为对象(而不是数组)* 传递的,getter就可以正常工作。我创建了一个代码片段来测试您的代码(希望我理解正确)。
encrypt()
和decrypt()
是简化的,因为它们在问题中不重要:控制台中的结果: