2

我正在尝试在插入 MongoDB 之前和之后加密和解密值。我正在使用猫鼬模式并调用 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 在保存到 db 时被加密,但在从 db 检索时未解密。

4

2 回答 2

12

我遇到了类似的问题,它对我有用:

  1. 向 Schema 添加“在转换为 json 时使用 getter”选项,例如:

new mongoose.Schema({...}, {toJSON: {getters: true}})

  1. 将猫鼬结果映射到 json,例如:

Products.find({}).then(a => console.log(a.map(p => p.toJSON())))

(说明:mongoose 转换为 json 时似乎只使用 getter,默认禁用。)

于 2019-08-30T16:11:10.810 回答
2

我发现了这个问题,这可能是你的问题。

如果objects作为对象(而不是数组)type_params传递,则 getter 可以正常工作。

我已经创建了代码片段来测试您的代码(希望我理解正确)。encrypt()并且decrypt()被简化,因为它们在问题中无关紧要:

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},
    runSettersOnQuery: true
});


var tempModel = mongoose.model('tempmodel', tempSchema);

var dataToSave = {name: 'Name',
                  sample_details: {
                    objects: { //just an object here, no array
                            object_key: 'ObjKey',
                            object_value: 'ObjVal'
                        },
                    type_params: { //just an object here, no array
                            type_key: 'TypeKey',
                            type_value: 'TypeVal'
                        },
                    test_body: 'TestBody'
                  }
};

var doc = new tempModel(dataToSave);

doc.save().then((doc) => {
    console.log(util.inspect(doc, false, null));
    mongoose.disconnect();
});

function encrypt(text){
    return text + '_enc';
}

function decrypt(text){
    return text + '_dec';
}

结果在控制台:

{ sample_details:
  { objects: { object_key: 'ObjKey', object_value: 'ObjVal_enc_dec' }, //'_dec' postfix is the result of decript()
    type_params: { type_key: 'TypeKey', type_value: 'TypeVal_enc_dec' }, //'_dec' postfix is the result of decript()
    test_body: 'TestBody_enc_dec' },
  name: 'Name',
  _id: 5aaec6c2b8f0701c9476420f,
  __v: 0,
  id: '5aaec6c2b8f0701c9476420f' }
于 2018-03-18T20:13:40.030 回答