如何通过Python获取Azure Key Vault中密钥的二进制内容?
从Azure Key Vault获取密钥二进制内容的Python实现
你当前使用get_key方法返回的是包含元数据的KeyVaultKey对象,要获取密钥的二进制内容,需要从对象的key属性(JsonWebKey类型)中提取对应字段,并进行Base64URL解码。
不同密钥类型的处理方式
Azure Key Vault支持多种密钥类型(如对称密钥oct、RSA密钥RSA/RSA-HSM、椭圆曲线密钥EC/EC-HSM),不同类型的密钥存储字段不同:
1. 对称密钥(oct类型)
对称密钥的二进制内容存储在JsonWebKey.k字段中,该字段是Base64URL编码格式,解码即可得到原始二进制:
from azure.identity import DefaultAzureCredential from azure.keyvault.keys import KeyClient import base64 credential = DefaultAzureCredential() key_client = KeyClient(vault_url="https://my-key-vault.vault.azure.net/", credential=credential) # 获取密钥对象 key = key_client.get_key("key-name") # 提取并解码对称密钥的二进制内容 if key.key.kty == "oct": key_binary = base64.urlsafe_b64decode(key.key.k + '=' * (-len(key.key.k) % 4)) print("对称密钥二进制内容:", key_binary)
2. RSA密钥(RSA/RSA-HSM类型)
RSA密钥的公钥部分包含模数n和公钥指数e,私钥部分额外包含d、p、q等参数,均为Base64URL编码,解码后得到二进制:
# 提取RSA公钥二进制内容 if key.key.kty in ["RSA", "RSA-HSM"]: # 解码模数n n_binary = base64.urlsafe_b64decode(key.key.n + '=' * (-len(key.key.n) % 4)) # 解码公钥指数e e_binary = base64.urlsafe_b64decode(key.key.e + '=' * (-len(key.key.e) % 4)) print("RSA模数二进制:", n_binary) print("RSA公钥指数二进制:", e_binary) # 如果有权限获取私钥材料,可提取私钥参数 if key.key.d is not None: d_binary = base64.urlsafe_b64decode(key.key.d + '=' * (-len(key.key.d) % 4)) print("RSA私钥指数二进制:", d_binary)
3. 椭圆曲线密钥(EC/EC-HSM类型)
椭圆曲线密钥的公钥存储在x和y字段,私钥存储在d字段,同样需要Base64URL解码:
if key.key.kty in ["EC", "EC-HSM"]: # 解码公钥x坐标 x_binary = base64.urlsafe_b64decode(key.key.x + '=' * (-len(key.key.x) % 4)) # 解码公钥y坐标 y_binary = base64.urlsafe_b64decode(key.key.y + '=' * (-len(key.key.y) % 4)) print("EC公钥x坐标二进制:", x_binary) print("EC公钥y坐标二进制:", y_binary) # 提取私钥(如果有权限) if key.key.d is not None: d_binary = base64.urlsafe_b64decode(key.key.d + '=' * (-len(key.key.d) % 4)) print("EC私钥二进制:", d_binary)
注意事项
- 确保你的身份凭据(
DefaultAzureCredential对应的主体)拥有Azure Key Vault的Keys/Get权限,否则无法获取密钥材料。 - Base64URL编码可能缺少填充字符
=,解码前需要补充,代码中'=' * (-len(...) % 4)用于自动补充所需的填充。
内容的提问来源于stack exchange,提问作者Kaja
相关产品推荐
相关产品推荐

