2016-12-23 8 views
0

mssqlデータベースを使用するnodejsアプリケーションから始めました。私は暗号化/復号化の目的のために、データベースに格納されている暗号化されたキーを持っているので、何かを暗号化/復号化するたびに、この値を取得し、データベースコールのコールバックで解読し、関数私はこの値を使って暗号化関数に渡します。Nodejs - アプリケーションでデータベースから値を取得して、将来使用するため

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; 

私が欲しいのは、実際に起動するアプリケーションのデータベースからそれを得るために、どこでも利用できるように、変数のどこか(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; 

ので、ワークフローは次のようになります。

  • 開始は、アプリケーション
  • がデータベースにこの非同期呼び出しを行うnodejs 、このキーを取得し、それを解読し、機能に

を暗号化するために、さらに呼び出しでそれを使用

  • グローバル変数に格納し、私はすでに独立し、ヘルパーファイルでそれを移動しようとしただけのファイルどこでこのヘルパーファイルを含めます暗号化/復号化ロジックが配置されていますが、単語「非同期」は混乱を招くものです。ヘルパーを読み込み、暗号化/復号化を行いますが、非同期であるため、このヘルパーが暗号化ロジックを使用する前にKEY値を初期化して返したことを確認することはできません。 コンソールで「処理されていない約束、約束の拒否」などのエラーメッセージが表示されます。

    Encrypt(inputData、decryptedKey)関数でdecryptedKeyを使用する前にdecryptedKeyが確実に初期化されるとは限りません。

    私は何ができるのは、(角に、app.runは)(あり)のようなnodejsで何かがあります:

    application.start() { 
        // do some logic before all other actions 
    } 
    
  • 答えて

    0

    あなたは(application.listenの呼び出し機能を渡す必要があります)第二として引数は、サーバーが起動するとすぐに実行されます。

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

    あなたが意味: 'application.listen(ポート、関数(){ SQL:クエリ( "キーを取得するクエリ"、[パラメータ]、 機能(データ){ を});'。 [OK]を、グローバルレベルで取得した値を保存することができます。プロジェクト内のヘルパー、ルート、およびその他のファイルで利用できるように、このリッスン機能の外で利用できます。 – frnfla

    +0

    なぜあなたも保存していますサーバーが起動するたびにデータベースを取得する必要がある場合は、データベースの値を変更する必要がありますか? –

    +0

    を設定ファイルに保存しないでください。彼の鍵はデータベースで暗号化されています。確かに、私はそれもconfigに保存されることを願った。私が問題に言及したように、私はdbから取得し、すべての暗号化/復号化コールでそれを復号化するソリューションを持っています。そして、今は「地獄のコールバック」があるように悪い習慣に思えます。私がアプリの起動時に一度だけ行うことができれば、dbの呼び出しとキーの解読に関するこれらの2つのコールバックを取り除くだろう。 – frnfla

    0

    解決策が見つかりました。コールバック関数をパラメータとして受け取り、DBからキーを取得し、それを解読し、成功した場合にコールバック関数に渡すヘルパーでの関数を作成しました。

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

    は、その後、私はそのヘルパーに同じ機能を呼び出し、データを「復号化された」私のグローバル変数を初期化して、コールバック関数渡さ:その後、私は実際に使用されるヘルパー内の別の機能を持っている

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

    を暗号化/復号化アクションが必要なアプリケーションコード内のどこにでも存在します。また、パラメータとしてコールバックを取ります

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

    ので、アプリの起動時に、私は私の「復号化された」変数は、データで初期化されます、と私はそれを必要とするアプリで、私はヘルパーを含めるとgetDecrypted機能を使用してどこに、そのコールバックで私の暗号化や復号化機能を使用して:

    var helper = require('helper'); 
    
    helper.getDecrypted(function (decrypted) { 
         encryptLogic(input, decrypted, function (data) { 
         . 
         . 
         . 
    

    だからFUNCNAMEを初期化するために、アプリの起動時に一度だけ呼び出されるヘルパーで変数を「復号化されました」。

    関連する問題