我不知道这个问题是否很简单,我只是不知道如何与哈希姆-Vault的Api VaultSharp签约,但我很绝望。
在这里可以找到包含示例的整个文档:https://github.com/rajanadar/VaultSharp加密和解密工作得很好。只有签字才是个问题。
加密代码:
public byte[] EncryptData(byte[] data, string keyName)
{
SecretsEngine transitSecretsEngine = new SecretsEngine
{
Type = SecretsEngineType.Transit,
Path = path
};
Client.V1.System.MountSecretBackendAsync(transitSecretsEngine).Wait();
Client.V1.Secrets.Transit.CreateEncryptionKeyAsync(keyName, new CreateKeyRequestOptions()
{
Exportable = true
}, path).Wait();
EncryptRequestOptions encryptOptions = new EncryptRequestOptions
{
Base64EncodedPlainText = Convert.ToBase64String(data),
ConvergentEncryption = true,
};
Secret<EncryptionResponse> encryptionResponse = Client.V1.Secrets.Transit.EncryptAsync(keyName,
encryptOptions, path).Result;
string cipherText = encryptionResponse.Data.CipherText;
return Encoding.Unicode.GetBytes(cipherText);
}解密代码:
public byte[] DecryptData(string ciphertext, string keyName)
{
DecryptRequestOptions decryptOptions = new DecryptRequestOptions
{
CipherText = ciphertext,
};
Secret<DecryptionResponse> decryptionResponse = Client.V1.Secrets.Transit.DecryptAsync(keyName,
decryptOptions, path).Result;
return Convert.FromBase64String(decryptionResponse.Data.Base64EncodedPlainText);
}这是我签署的“代码”试用版:
public byte[] Sign(byte[] plaintextBytes, string keyName)
{
byte[] hash = ComputeHash(plaintextBytes,SHA256.Create());
GCKMS.SignatureOptions options = new GCKMS.SignatureOptions()
{
Digest = Convert.ToBase64String(hash),
};
Secret<GCKMS.SignatureResponse> result = Client.V1.Secrets.GoogleCloudKMS.SignAsync(keyName,
options).Result;
return Encoding.Unicode.GetBytes(result.Data.Signature);
}错误是:
VaultSharp.Core.VaultApiException:{“错误”:“路由‘gcpkms/符号/Manuel’没有处理程序”}
最后但并非最不重要的是,我的验证签名的代码:
public bool ValidateSignature(byte[] plaintextByte, byte[] signature, string keyName)
{
GCKMS.VerificationOptions option = new GCKMS.VerificationOptions
{
Digest = Encoding.Unicode.GetString(ComputeHash(plaintextByte)),
Signature = Encoding.Unicode.GetString(signature)
};
Secret<GCKMS.VerificationResponse> result =
Client.V1.Secrets.GoogleCloudKMS.VerifyAsync(keyName, option).Result;
return result.Data.Valid;
}我不确定,但这可能是因为我没有使用带有路径的SecretsEngine。我找不到任何SecretsEngine的GoogleCloudKms。
有用信息:
我用Guid.NewGuid().ToString();生成路径。
ComputeHash是一个用给定算法计算哈希的自写函数。默认算法是SHA256。
GCMS是名称空间VaultSharp.V1.SecretsEngines.GoogleCloudKMS的一个简短版本。
任何想法和建议都是非常欢迎的。
提前感谢!
发布于 2022-03-18 13:46:46
虽然Vault提供方便的传输签名,但您使用的C#包装器不支持它。。
Google确实提供了签名,但是它的界面更复杂:您必须自己进行散列,并跟踪关键版本。
我建议您在API包装器上玩个小把戏:
在将数据发送到Vault之前,您仍然必须对数据进行base64,以避免二进制编码问题。
因此,假设:
StackOverflow上签名transit下。my-key这应该会让你开始:
var value = new Dictionary<string, object> { "input", Convert.ToBase64String(Encoding.UTF8.GetBytes("StackOverflow")) } };
var writtenValue = await vaultClient.V1.Secrets.KeyValue.V1.WriteSecretAsync("sign/my-key", value, "transit");https://stackoverflow.com/questions/71509873
复制相似问题