本文介绍如何校验数字签名信息。
背景信息
在计算巢ECS内发起API调用时(如调用CheckoutLicense
、PushMeteringData
等),计算巢会返回数字签名信息(即Token字段),服务商可以使用后文的方法计算数字签名信息的值,并将计算得到的数字签名信息和计算巢返回的数字签名信息进行对比,判断数据是否被篡改。
数字签名信息校验流程
消息处理流程
此处以调用CheckoutLicense
的返回值为例,计算数字签名的值。
调用
CheckoutLicense
,获取返回值。curl -H "Content-Type: application/json" -XPOST https://cn-wulanchabu.axt.aliyun.com/computeNest/license/check_out_license -d '{}'
返回值
{ "code":200, "requestId":"4ea52d12-8e28-440b-b454-938d0518xxxx", "instanceId":"i-0jl1ej1czubkimg6xxxx", "result":{ "RequestId":"CF54B4C9-E54C-1405-9A37-A0FE3D60xxxx", "ServiceInstanceId":"si-85a343279cf341c2xxxx", "LicenseMetadata":"{\"TemplateName\":\"Custom_Image_Ecs\",\"SpecificationName\":\"dataDiskSize\",\"CustomData\":\"30T\"}", "Token":"21292abff855ab5c2a03809e0e4fb048", "ExpireTime":"2022-11-10T08:03:16Z" } }
取出参数部分的字段,并将参数字段去掉数字签名(token)信息后,按首字母进行排序并用&符号进行拼接。
拼接后的字符串如下:
expireTime=2022-11-02T02:39:43Z&licenseMetadata={"TemplateName":"Custom_Image_Ecs","SpecificationName":"dataDiskSize","CustomData":"30T"}&requestId=CF54B4C9-E54C-1405-9A37-A0FE3D60xxxx&serviceInstanceId=si-85a343279cf341c2xxxx
说明对于存在
LicenseMetadata
(许可证元数据)的服务,建议模板中的参数不要出现中文(例如套餐名、模板名称),否则在加签处理中会出现错误,导致签名不一致。在排序后的字符串最后加上该服务的密钥。
服务密钥的字符串格式为:key={ServiceProviderKey}。您可在服务详情页,获取服务密钥。
加上服务密钥后的字符串如下:
expireTime=2022-11-02T02:39:43Z&licenseMetadata={"TemplateName":"Custom_Image_Ecs","SpecificationName":"dataDiskSize","CustomData":"30T"}&requestId=CF54B4C9-E54C-1405-9A37-A0FE3D60xxxx&serviceInstanceId=si-85a343279cf341c2xxxx&key=37131c4a485141xxxxxx
使用MD5加密算法对处理后的字符串进行加密,加密后得到的为32位小写的值。
加密完成后,得到的值为:21292abff855ab5c2a03809e0e4fb048。
服务商通过上述方法计算得到的Token值,与计算巢返回的Token值进行对比。若两个值相同,则表示数据未被篡改。