我正在使用 KeyVaultClient 在 key 保管库中添加新的 secret 。当增加的 secret 值较小时,它工作得很好。当我们添加一个长 secret 值时系统不接受该值,响应得到“Operation returned an invalid status code '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 中获取异常。
我注意到,当添加较小的 secret 值时,没有错误。 secret 值字符有限制吗?如何处理这些限制?
最佳答案
简短回答
很可能您会遇到长值(而不是短值)的异常,因为您超出了使用您的 key 和所选算法可以加密的消息的最大长度。
解决此问题的一种方法可能是使用具有相同算法的更高长度的 key ,或者考虑更改 key 长度和算法的组合。 (详情如下)
长答案
明显的问题是您可以加密的最大长度是多少。微软关于两者的文档,
- SDK方法KeyVautltClient.EncryptAsync以及
- Encrypt operation通过 REST API
简单地陈述这样的事情
Note that the ENCRYPT operation only supports a single block of data, the size of which is dependent on the target key and the encryption algorithm to be used.
在您的代码中,您选择了 JsonWebKeyEncryptionAlgorithm.RSAOAEP
作为算法,并且当您将代码指向保管库中的 key 之一时,您会知道 key 长度。
再次查看微软关于使用该算法的文档 RSA-OEAP Encrypt/Decrypt
现在,
- 使用的哈希函数将为 SHA-1
- 使用的掩码生成算法为 MGF1
您可以在 RFC 3447 中阅读更多详细信息。搜索“A.2.1 RSAES-OAEP”
根据detailed crypto.stackexchange post做一些数学计算
免责声明:您的条件是这样的(我不是这个主题的专家,因此可能会在适用的精确计算上出错,但您将遵循有关 key 长度和算法的核心思想到此结束时将影响最大消息大小:))
SHA-1 表示输出大小为 160,即 hlen = 20
假设您现在使用的 key 长度为 1024(您可以根据 key 大小更改此值)。
mLen = 1024 / 8 - 2 * 160 / 8 - 2 = 86
如果您使用 key 长度 2048
mLen = 2048 / 8 - 2 * 160 / 8 - 2 = 214
希望所有解释/链接都能让您了解该重要语句的工作原理 - 最大长度/大小取决于要使用的目标 key 和加密算法。
关于azure - 加密 secret 值时出错 - 操作返回无效状态代码 'BadRequest',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52511994/