KMS 解密结果未分配给抽象类静态变量

问题描述 投票:0回答:1

我们正在 AWS lambda 函数中加密环境变量“dbPassword”,并尝试在打字稿文件中解密该加密值。

import * as AWS from 'aws-sdk';
const kmsClient = new AWS.KMS({region: 'us-east-1'});

class EncryptionUtility
{
    static async decryptEnvironmentVariable(encryptedValue: string): string {
        try
        {
            console.log("function decryptEnvironmentVariable() input value => ",encryptedValue);
            
            const req = {
                CiphertextBlob: Buffer.from(encryptedValue, 'base64'),
                EncryptionContext: { LambdaFunctionName: 'ioh_reference_data_service' },
            };
            
            const decryptResult = await kmsClient.decrypt(req).promise();
           
            if (Buffer.isBuffer(decryptResult.Plaintext)) {
                return Buffer.from(decryptResult.Plaintext).toString();
            } 
            else 
            {
                throw new Error('We have a problem');
            }
            
        }
        catch(e)
        {
            console.log("Exception Generated while executing decryptEnvironmentVariable() => ",e);
        }
    }
}


export abstract class Config {
   
    static dbPassword: string = await EncryptionUtility.decryptEnvironmentVariable(process.env.dbPassword);
 
}

在上面的代码中,我希望 Config 类的 dbPassword 静态变量应该具有解密的值。

当我在控制台中打印 Config.dbPassword 时,我得到 undefined

另外,我收到错误,await 不能在抽象类中使用。

Config 类正在许多其他地方使用,我希望在 Config 类本身中拥有解密的值,以便其他地方完好无损。

您能否为我提供解决方案,例如如何在我的 Config 静态变量中实现此解密值?

任何人领导将不胜感激!

node.js abstract amazon-kms
1个回答
0
投票

您面临的问题是您不能在类字段初始化中使用await,尤其是在静态上下文中。相反,您可以在单独的静态方法中或在 Lambda 初始化期间设置 dbPassword。

你需要做类似的事情:

import * as AWS from 'aws-sdk';

const kmsClient = new AWS.KMS({ region: 'us-east-1' });

class EncryptionUtility {
  static async decryptEnvironmentVariable(encryptedValue: string): Promise<string> {
    try {
      console.log("function decryptEnvironmentVariable() input value => ", encryptedValue);

      const req = {
        CiphertextBlob: Buffer.from(encryptedValue, 'base64'),
        EncryptionContext: { LambdaFunctionName: 'ioh_reference_data_service' },
      };

      const decryptResult = await kmsClient.decrypt(req).promise();

      if (Buffer.isBuffer(decryptResult.Plaintext)) {
        return Buffer.from(decryptResult.Plaintext).toString();
      } else {
        throw new Error('We have a problem');
      }
    } catch (e) {
      console.log("Exception Generated while executing decryptEnvironmentVariable() => ", e);
      throw e; 
    }
  }
}

export abstract class Config {
  static dbPassword: string;

  static async initializeConfig() {
    try {
      Config.dbPassword = await EncryptionUtility.decryptEnvironmentVariable(process.env.dbPassword);
    } catch (e) {
      console.error("Error initializing Config:", e);
    }
  }
}

Config.initializeConfig();

但是,为什么不使用 ParameterStore,而不是使用加密的环境变量呢?这会大大简化事情。

© www.soinside.com 2019 - 2024. All rights reserved.