首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与HashiCorp Vault签约?

如何与HashiCorp Vault签约?
EN

Stack Overflow用户
提问于 2022-03-17 09:28:02
回答 1查看 493关注 0票数 2

我不知道这个问题是否很简单,我只是不知道如何与哈希姆-Vault的Api VaultSharp签约,但我很绝望。

在这里可以找到包含示例的整个文档:https://github.com/rajanadar/VaultSharp加密和解密工作得很好。只有签字才是个问题。

加密代码:

代码语言:javascript
复制
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);
}

解密代码:

代码语言:javascript
复制
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);
}

这是我签署的“代码”试用版:

代码语言:javascript
复制
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’没有处理程序”}

最后但并非最不重要的是,我的验证签名的代码:

代码语言:javascript
复制
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的一个简短版本。

任何想法和建议都是非常欢迎的。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-18 13:46:46

虽然Vault提供方便的传输签名,但您使用的C#包装器不支持它。

Google确实提供了签名,但是它的界面更复杂:您必须自己进行散列,并跟踪关键版本。

我建议您在API包装器上玩个小把戏:

  • 将加密和解密代码保持原样。
  • 写入传输后端,就好像它是KV存储版本1
  • 通过参数签名

在将数据发送到Vault之前,您仍然必须对数据进行base64,以避免二进制编码问题。

因此,假设:

  • 您想要在文本StackOverflow上签名
  • 中转后端安装在transit下。
  • 您的签名密钥名为my-key

这应该会让你开始:

代码语言:javascript
复制
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");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71509873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档