加密机密值时出错-操作返回了无效的状态码'BadRequest'

时间:2018-09-26 07:13:34

标签: azure azure-keyvault

我正在使用KeyVaultClient在密钥库中添加新机密。当添加较小的秘密值时,它可以完美工作。当我们添加一个不接受该值的长秘密值系统时,响应得到“操作返回了无效的状态码'BadRequest'”。

代码-

 var kv = new KeyVaultClient(AuthHelper.GetToken);
 var key = kv.GetKeyAsync("https://xxxxxxx.vault.azure.net/", "Key1").GetAwaiter().GetResult();

 var byteData = Encoding.Unicode.GetBytes("long data...........");//here long secret value 
 var encryptData = kv.EncryptAsync("https://xxxxxx.vault.azure.net/keys/Key123/98888xxxxxxxxxxxxx", JsonWebKeyEncryptionAlgorithm.RSAOAEP, byteData).GetAwaiter().GetResult();

在kv.EncryptAsync中获取异常。

我注意到,当添加较小的秘密值时,没有错误。是否存在秘密值字符限制?如何处理这些限制?

2 个答案:

答案 0 :(得分:1)

简短回答

很可能您会因为长值(而不是短值)而出现异常,因为您超出了可以使用密钥和所选算法加密的最大消息长度

解决此问题的一种方法可能是使用具有相同算法的较长密钥,或者着眼于更改密钥长度和算法的组合。 (以下详细信息)

长答案

一个明显的问题是您可以加密的最大长度是多少。微软的文档,

简单地陈述这样的事情

  

请注意,ENCRYPT操作仅支持单个数据块,   其大小取决于目标密钥和要使用的加密算法

在代码中,您选择了JsonWebKeyEncryptionAlgorithm.RSAOAEP作为算法和密钥长度,当您将代码指向库中的密钥之一时,您就会知道。

再次,查看有关使用此算法的Microsoft文档 RSA-OEAP Encrypt/Decrypt

enter image description here

现在,

  1. 使用的哈希函数将为SHA-1
  2. 使用的掩码生成算法将为MGF1

您可以在RFC 3447中阅读更多详细信息。搜索“ A.2.1 RSAES-OAEP”

根据detailed crypto.stackexchange post

做一些数学运算

免责声明:您的情况将是这样的(我不是该主题的专家,因此可能适用的精确计算可能会出错,但是您将遵循有关密钥长度和算法的核心思想)到此为止将影响最大消息大小:))

enter image description here

SHA-1表示输出大小为160,即hlen = 20

假设您现在使用的密钥长度为1024(可以根据密钥大小来更改此长度)。

mLen = 1024 / 8 - 2 * 160 / 8 - 2 = 86

如果您使用的密钥长度为2048

mLen = 2048 / 8 - 2 * 160 / 8 - 2 = 214

希望所有的说明/链接都使您对该重要语句的工作方式有所了解-最大长度/大小取决于要使用的目标密钥和加密算法

答案 1 :(得分:0)

  

是否存在秘密值字符限制?如何处理这些限制?

Azure Key Vault中的秘密是八位字节序列,每个最大大小为25k字节

Azure Key Vault还支持密钥的contentType字段。客户端可以指定秘密的内容类型contentType,以帮助在检索秘密数据时解释该秘密数据。 此字段的最大长度为255个字符。没有预定义的值。建议的用法是解释机密数据的提示。

有关更多详细信息,您可以参考此article