2016-11-07 17 views
1

Ist es möglich, auf einem verschlüsselten Feld in mongodb teilweise (wie/regex Abfrage) zu suchen?MongoDB verschlüsselte Feld Teilsuche

Ich habe ein Feld, das verschlüsselte E-Mail-ID enthält. Also in Mongo die E-Mail [email protected] wird 1bcuh6762jhjdSOME_ENCRYPTED_VALUE, jetzt ist es möglich, teilweise Suche nach diesem verschlüsselten Wert

+0

Nur wenn Sie schwache Verschlüsselung verwenden. Wenn Sie beispielsweise nur Präfix-Übereinstimmungen benötigen, können Sie einen Verschlüsselungsalgorithmus verwenden, der Präfixe beibehält. – CodesInChaos

+0

Es gibt einige ausgefallene durchsuchbare Crypto (z. B. vergessene RAM), aber ich glaube nicht, dass Sie es verwenden möchten. http://outsourcedbits.org/categories/encrypted-search/ – CodesInChaos

+0

@CodesInChaos Jeder Link für Tutorial oder einige Wiki? –

Antwort

1

Ich stieß auf ein ähnliches Problem, das ich gelöst, indem Hash aller möglichen Werte, die mehr als 3 Buchstaben waren. und erstellt Hash für alle möglichen Kombinationen, können Sie den Wert hinzufügen, der mit pre('save') festgelegt wird.

In Schema dieser Funktion erstellen:

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

mySchema.pre('save', createHash); 

Ein Modul für Hashing 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)); 
    } 
} 

nach, dass Sie alle Ihre Aufzeichnungen wie diese migrieren können: Jetzt

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

Wenn Sie suchen, müssen Sie createHash Funktion verwenden, um zu machen Hash von Keyword und suchen Sie es in Ihrer Datenbank.

Ich hoffe, das hilft.