无法使用@ google-cloud / kms nodejs模块解密密钥

时间:2018-10-02 22:44:18

标签: google-cloud-kms

代码:

contents = encryptedWebhookSecret[0].toString();
console.log(typeof contents);
console.log(contents);
const formattedName = kmsClient.cryptoKeyPath(PROJECT, 'global', KEYRING, KEY);
const kmsDecryptRequest = { 
    name: formattedName,
    ciphertext: contents //encryptedWebhookSecret
};  
console.log("Decrypting webhook secret...");
return kmsClient.decrypt(kmsDecryptRequest);

encryptedWebhookSecret是使用@ google-cloud / storage客户端进行download()操作的结果。这将返回一个[Buffer],我将其强制转换为字符串。我记录了加密的字符串,它的值是正确的。我可以从命令行使用gsutil下载加密的机密,并且gcloud kms decrypt可以正常工作。

此错误似乎表明字符串未正确编码(应该不是utf8吗?)。

PROJECT,KEYRING和KEY的值已经过两次和三次检查,并且是正确的。

错误:

ERROR: Error: invalid encoding at Error (native) at Object.decode (/user_code/node_modules/@google-cloud/kms/node_modules/@protobufjs/base64/index.js:105:19) at Type.DecryptRequest$fromObject [as fromObject] (eval at Codegen (/user_code/node_modules/@google-cloud/kms/node_modules/@protobufjs/codegen/index.js:50:33), <anonymous>:12:15) at Type.fromObject (/user_code/node_modules/@google-cloud/kms/node_modules/protobufjs/src/type.js:538:25) at serialize (/user_code/node_modules/@google-cloud/kms/node_modules/grpc/src/protobuf_js_6_common.js:70:23) at Object.final_requester.sendMessage (/user_code/node_modules/@google-cloud/kms/node_modules/grpc/src/client_interceptors.js:802:37) at InterceptingCall._callNext (/user_code/node_modules/@google-cloud/kms/node_modules/grpc/src/client_interceptors.js:418:43) at InterceptingCall.sendMessage (/user_code/node_modules/@google-cloud/kms/node_modules/grpc/src/client_interceptors.js:460:8) at InterceptingCall._callNext (/user_code/node_modules/@google-cloud/kms/node_modules/grpc/src/client_interceptors.js:424:12) at InterceptingCall.sendMessage (/user_code/node_modules/@google-cloud/kms/node_modules/grpc/src/client_interceptors.js:460:8)

编辑:当我尝试使用base64编码时,出现“ TypeError:键必须是Object处新Hmac(crypto.js:93:16)处TypeError(native)处的缓冲区。的Hmac(crypto.js:91:12)位于isRequestValid(/user_code/index.js:81:8),位于解密WebhookSecret.then(/user_code/index.js:119:21)。

2 个答案:

答案 0 :(得分:1)

Node客户端库要求将纯文本和密文作为缓冲区提交。这很容易-您只需在上面的示例中执行ciphertext: Buffer.from(contents)

答案 1 :(得分:1)

问题是ciphertext需要使用base64编码。