2016-12-23 14 views
0

Ich begann mit Nodejs-Anwendung, die MSSQL-Datenbank verwendet. Zur Verschlüsselung/Entschlüsselung habe ich einen verschlüsselten Schlüssel, der in der Datenbank gespeichert ist, also muss ich jedes Mal, wenn ich etwas entschlüssele, zuerst einen Datenbankaufruf machen, diesen im Callback des Datenbankaufrufs entschlüsseln und dann in einem anderen Callback entschlüsseln Funktion Ich verwende diesen Wert, um ihn an die Verschlüsselungsfunktion zu übergeben.Nodejs - Wert aus der Datenbank beim Start der Anwendung für die zukünftige Verwendung

sql.query("query to get key", [parameters], 
      function (data) { 
       if (data && (data.length == 1)) {  
        Decrypt(data[0].Key, iv, salt, function (data) { 
         var decryptedKey = data; 
         Encrypt(inputData, decryptedKey, function (data){ 
          var encryptedData = data; 

Was ich will, ist „aus der Datenbank erhalten Schlüssel und entschlüsselt“ bewegen Logik auf einem anderen Ort, eigentlich ist es auf Anwendung von Datenbank zu bekommen starten und speichern Sie es irgendwo in den Variablen überall verfügbar zu sein (decryptedKey):

sql.query("query to get key", [parameters], 
      function (data) { 
       if (data && (data.length == 1)) {  
        AESDecrypt(data[0].Key, iv, salt, function (data) { 
         var decryptedKey = data; 

So soll, Workflow sein:

  • Start NodeJS Anwendung
  • diesen asynchronen Anruf zur Datenbank erhalten, diesen Schlüssel, entschlüsseln und speichern sie in einer globalen Variable
  • es in weiteren Anrufe verwenden Funktion

ich schon bewegen sie in separaten, Helfer-Datei versucht, und sind in der Datei diese Hilfsdatei nur zu verschlüsseln, wo Verschlüsselung/Entschlüsselungslogik befindet sich, aber das Wort "asynchron" ist, was Verwirrung verursacht. Es liest Helfer, macht Verschlüsselung/Entschlüsselung aber kann nicht sicher sein, dass dieser Helfer initialisiert und KEY-Wert zurückgegeben hat, bevor Verschlüsselungslogik ihn verwendet, da es asynchron ist. So erhalte ich Fehlermeldungen in der Konsole über „nicht behandelte Versprechen, versprechen Ablehnungen“ usw.

Es stellt nicht sicher, dass decryptedKey vor Encrypt (EingDaten, decryptedKey) initialisiert wird Funktion nutzt.

Was kann ich tun, es ist etwas in NodeJS wie (in Angular, werde app.run()):

application.start() { 
    // do some logic before all other actions 
} 

Antwort

0

Sie benötigen eine Anruffunktion() übergeben als zweites application.listen Argument, das ausgeführt wird, sobald der Server gestartet wird.

application.listen(9090,function(){ 
    //do some logic before all other actions 
}); 
+0

Sie bedeuten:.. 'application.listen (Port, function() { sql.query ("Abfrageschlüssel zu bekommen", [Parameter], Funktion (Daten) { });' wo Anwendung ist Express-Instanz? Ok, wie kann ich abgerufenen Wert auf globaler Ebene, um außerhalb dieser Funktion zu hören, verfügbar für Helfer, Routen und andere Dateien in Projekt usw. – frnfla

+0

Warum speichern Sie sogar der Wert in der Datenbank, wenn Sie es jedes Mal abrufen müssen, wenn der Server startet? Warum nicht in irgendeiner Konfigurationsdatei? –

+0

Weil das Nachfrage ist sein Schlüssel in der Datenbank verschlüsselt. Glauben Sie, ich wünschte, es wäre auch in der Konfig gespeichert. Wie ich in Frage erwähnt habe, habe ich eine Lösung, die aus db abruft und sie bei jedem Ver-/Entschlüsselungs-Aufruf entschlüsselt, und es scheint so schlecht zu sein, dass ich jetzt "höllische Rückrufe" habe. Wenn ich es nur einmal beim Start der App tun könnte, würde ich diese beiden Callbacks bezüglich des Aufrufs von db und der Entschlüsselung des Schlüssels loswerden. – frnfla

0

Ich fand eine Lösung. Funktion im Helper erstellt, die Callback-Funktion als Parameter akzeptiert, Schlüssel aus DB holt, entschlüsselt und bei Erfolg an die Callback-Funktion übergibt.

var decrypted = ''; 

var funcName= function (callback) { 
    //get and decrypt key logic 
    callback(data); 
} 

Dann aufgerufen ich gleiche Funktion in dieser Helfer und übergeben es Callback-Funktion, die meine globale Variable „entschlüsselt“ mit Daten initialisiert:

funcName(function (data) { 
    decrypted = data; 
}); 

Dann habe ich eine andere Funktion in Helfer, die tatsächlich verwendet werden, wo auch immer in App-Code, wo Verschlüsselung/Entschlüsselung Aktion benötigt wird.Es nimmt auch Callback als Parameter:

getDecrypted: function (callback) { 
    if (decrypted == '') { 
     funcName(function (data) { 
      decrypted = data; 
      callback(decrypted); 
     }); 
    } 
    else { 
     callback(decrypted); 
    } 
}, 

Also, auf app starten, werde ich meine „entschlüsselt“ Variable mit Daten initialisiert werden, und überall dort, wo in app, wo ich es brauche und ich sind nur Helfer und verwenden getDecrypted Funktion, mit meiner Verschlüsselung oder Entschlüsselung Funktion in seinem Rückruf:

var helper = require('helper'); 

helper.getDecrypted(function (decrypted) { 
     encryptLogic(input, decrypted, function (data) { 
     . 
     . 
     . 

funcName wird also nur einmal auf app Start aufgerufen werden, um zu initialisieren „entschlüsselte“ Variable in Helfern.

Verwandte Themen