我正在尝试使用 google KMS 工具解密令牌。在本地运行它,出于某种原因,加密似乎有效但解密无效。
我正在运行以下代码:
import base64
import googleapiclient.discovery
kms_client = googleapiclient.discovery.build('cloudkms', 'v1')
crypto_keys = kms_client.projects().locations().keyRings().cryptoKeys()
name = "projects/my-project/locations/my-loc/keyRings/my-kr/cryptoKeys/my-key"
request = crypto_keys.decrypt(name=name, body={'ciphertext': base64.b64encode("my text").decode('ascii')})
response = request.execute()
Run Code Online (Sandbox Code Playgroud)
最后一行返回 400 错误:
HttpError: <HttpError 400 when requesting https://cloudkms.g[...]ion:decrypt?alt=json
returned "Decryption failed: verify that 'name' refers to the correct CryptoKey.">
Run Code Online (Sandbox Code Playgroud)
然而,这个名字实际上似乎是正确的。令人惊讶的是,通过替换对decryptby的调用encrypt,我获得了有效的输出。
我是否遗漏了一个明显的错误,还是应该在项目的 github 上打开一个问题?
编辑:我试图解密纯文本,这当然没有多大意义(但错误消息在某种程度上误导了我)。
这个问题是一个跟进到这一个.我正在尝试使用apache beam从google spanner表中读取数据(然后进行一些数据处理).我使用java SDK编写了以下最小示例:
package com.google.cloud.dataflow.examples;
import java.io.IOException;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.PipelineResult;
import org.apache.beam.sdk.io.gcp.spanner.SpannerIO;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.values.PCollection;
import com.google.cloud.spanner.Struct;
public class backup {
public static void main(String[] args) throws IOException {
PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);
PCollection<Struct> rows = p.apply(
SpannerIO.read()
.withInstanceId("my_instance")
.withDatabaseId("my_db")
.withQuery("SELECT t.table_name FROM information_schema.tables AS t")
);
PipelineResult result = p.run();
try {
result.waitUntilFinish();
} catch (Exception exc) {
result.cancel();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用DirectRunner执行代码时,我收到以下错误消息:
org.apache.beam.runners.direct.repackaged.com.google.common.util.concurrent.UncheckedExecutionException:
org.apache.beam.sdk.util.UserCodeException:java.lang.NoClassDefFoundError:无法初始化类com.google.cloud.spanner.spi.v1.SpannerErrorInterceptor
[...]引起:org.apache.beam.sdk.util.UserCodeException:java.lang.NoClassDefFoundError:无法初始化类com.google.cloud.spanner.spi.v1.SpannerErrorInterceptor
[...]引起:java.lang.NoClassDefFoundError:无法初始化类com.google.cloud.spanner.spi.v1.SpannerErrorInterceptor
或者,使用DataflowRunner: …
在Apache的梁编程指南包含以下规则:
3.2.2。不变性
PCollection是不可变的。创建后,您将无法添加,删除或更改单个元素。Beam变换可以处理PCollection的每个元素并生成新的管道数据(作为新的PCollection),但是它不会消耗或修改原始的输入集合。
这是否意味着我不能,一定不能或不应该在自定义转换中修改单个元素?具体来说,我正在使用python SDK并考虑将dict {key: "data"}作为输入,进行一些处理并添加更多字段的转换情况{other_key: "some more data"}。我对上述规则3.2.2的解释是,我应该这样
def process(self,element):
import copy
output = copy.deepcopy(element)
output[other_key] = some_data
yield output
Run Code Online (Sandbox Code Playgroud)
但我想知道这是否有点过大。
使用TestPipeline,我发现如果我在process()方法中对其进行操作,则输入集合的元素也会被修改(除非这些元素是基本类型,例如int,float,bool ...)。
变异元素被认为是绝对不行的,还是仅需谨慎的一种做法?