MongoDB加密字段部分搜索

时间:2016-11-07 12:25:21

标签: mongodb search encryption

是否可以在mongodb中的加密字段上进行部分搜索(如/ regex查询)?

我有一个包含加密电子邮件ID的字段。因此,在mongo中,电子邮件some@email.com变为1bcuh6762jhjdSOME_ENCRYPTED_VALUE,现在可以对此加密值进行部分搜索

1 个答案:

答案 0 :(得分:1)

通过创建超过3个字母的所有可能值的哈希,我遇到了一个类似的问题我解决了它。并为所有可能的组合创建哈希,您可以使用pre('save')添加要设置的值。

在架构中您可以创建此功能:

function createHash(next) {
    this.hashes = hash.createHashForField(this.text);
    debug(text);
    next();
}

mySchema.pre('save', createHash);

散列hash.js

的模块
const hash = require('crypto');
const adler32 = require('adler32');
const crypto = require('crypto');
const _  = require('lodash');
adler32.register();

module.exports = Hash = {
    /**
     * This method creates hash of given text;
     * @param text - text to hash;
     */
    createHash: (text) => {
        return crypto.createHash('adler32').update(text, 'ascii').digest('hex');
    },
    /**
     *
     * @param text- text separated by spaces
     */
    createHashForText: (text) => {
        "use strict";
        text= text.toLowerCase();
        text= text.trim();
        let textSlices = _.flatten(text.split(' ').filter(x => x.length)
          .map((part) => {
            if (part.length < 3) {
                return part;
            }
            let nameSlices = [];
            for (let index = 2; index < part.length; index ++) {
                let n = part.slice(0, index+1);
                textSlices .push(n);
            }
            return textSlices ;
        }));

        return textSlices .map(n => Hash.createHash(n));
    }
}

之后你可以像这样迁移所有记录:

myModel.find({}).then(docs => {
    docs.forEach(doc => doc.save().catch(console.log))
})

现在搜索时,您必须使用createHash函数来创建关键字的哈希并在数据库中搜索它。

我希望这会有所帮助。