通常客户接入设备指纹应用到业务场景分为两部分,第一步客户的应用需要集成 SDK 先采集设备信息,由同盾返回设备信息黑盒。第二步客户端应用获取到黑盒传递给风控中台,由风控中台通过黑盒调设备指纹服务获取设备ID 及设备信息进行决策。
密封客户端结果,是在客户应用接入SDK 的时候就可以选择是否直接返回加密的设备信息,如果确认由前端应用获取,同盾 SDK 会直接返回匿名ID、黑盒及加密的设备信息,由客户的风控中台通过密钥解密设备信息,进行决策,省略了风控中台与设备指纹服务交互的步骤。
优点:

如果您想使用密封客户端结果,需要完成以下步骤
导航到客户平台-开发者-密钥&SDK-加密密钥


复制 加密密钥 提供给服务端使用

前端发送客户端密封结果到服务端后,需要使用上面生成的加密密钥进行解密。
解密密封结果代码参考:
import base64
import json
import zstandard as zstd
import io
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
def aes_decrypt(source, key_str):
try:
# Base64 解码
data = base64.b64decode(source)
key_bytes = base64.b64decode(key_str)
# 验证最小长度 (IV12 + TAG16 + Zstd最小头5)
if len(data) < 12 + 16 + 5:
raise ValueError("Data too short for valid payload")
# 提取各部分
iv = data[:12]
auth_tag = data[-16:]
ciphertext = data[12:-16]
# AES-GCM 解密
cipher = Cipher(
algorithms.AES(key_bytes),
modes.GCM(iv, auth_tag),
backend=default_backend()
)
decryptor = cipher.decryptor()
compressed = decryptor.update(ciphertext) + decryptor.finalize()
# 验证Zstd帧头
if compressed[:4] != b'\x28\xb5\x2f\xfd': # Magic Number
raise ValueError("Invalid Zstd header")
# 流式解压适配分块压缩
dctx = zstd.ZstdDecompressor()
with dctx.stream_reader(io.BytesIO(compressed)) as reader:
decompressed = reader.read() # 自动处理未知大小
# 返回JSON字符串
device_info = decompressed.decode('utf-8')
return json.dumps(device_info)
except Exception as e:
print(f"AES256-ZSTD decrypt fail! {e}")
return None
# encryptionKey
keyStr = "your encryptionKey"
# sealedResult
source = "your sealedResult"
result = aes_decrypt(source, keyStr)
print(result)
密封结果解密示例:
{
"device_risk_score": 4,
"code": 200,
"channel": "apitest",
"device_risk_label": ["adb_link"],
"device_risk_tools": {
"running_risk_tools_type": [],
"installed_risk_tools_type": []
},
"device_detail": {
"app_version": "5.0.0",
"language": "zh",
"installed_packages": "[{\"package\":\"cn.tongdun.mobrisk.demo\",\"name\":\"-\"}]",
"mcc": "",
"wifi_ip": "",
"device_svn": "20",
"available_storage": 109139550208,
"cpu_type": "",
"dns_address": "",
"host": "cn-west-hcd-5a-ad305db651716345895703-78bb978c87-7thzf",
"model": "TAS-AL00",
"brand": "HUAWEI",
"hardware": "kirin990",
"longitude": 0.0,
"cell_ip": "",
"ip": "10.57.30.10",
"screen_resolution": "1080x2340",
"cpu_hardware": "",
"charge_state": "full",
"up_time": 110874673,
"audio_mode": 0,
"aid": "00000000-0000-0000-0000-000000000000",
"startup_time": 1745295692850,
"bssid": "",
"latitude": 0.0,
"running_packages": "cn.tongdun.mobrisk.demo",
"proxy_info": "",
"device_name": "HWTAS",
"total_memory": 7925583872,
"vpn_true_ip": "",
"ipv6": "",
"system_version": "12",
"baseband_version": "21C20B715S000C000",
"fp_version": "5.0.0",
"country_iso": "cn,-",
"current_time": 1745406567523,
"product": "TAS-AL00",
"mnc": "",
"sim_operator": "中国电信,-",
"battery_level": 100,
"vpn_ip": "",
"api_version": "31",
"time_zone": "UTC+08:00",
"sign_md5": "03ce925f76ceb40e1c2ed8bfe3fcdd0c480a7ba8689ff814c601edfbf79e339e",
"screen_brightness": 31,
"carrier": "-,-",
"package_name": "cn.tongdun.mobrisk.demo",
"available_memory": 4362240000,
"total_storage": 117555855360,
"android_id": "9223e63cc64ba3ed",
"network_type": "wifi"
},
"message": "success",
"device_os": "Android",
"device_history_risk_label": [
{
"last_time": "1745312268033",
"label": "device_info_tampered"
},
{
"last_time": "1744612104302",
"label": "debugger_detected"
},
{
"last_time": "1743389182833",
"label": "abnormal_time"
},
{
"last_time": "1739946217228",
"label": "short_uptime"
},
{
"last_time": "1745464165274",
"label": "adb_link"
},
{
"last_time": "1741937366712",
"label": "replay_attacks"
}
],
"anonymous_id": "Iop9ffi1Pvs7N39968k617537Q3GK8TJ39fe63d7b78e0361",
"sequence_id": "1745476264739000X0497006B4905617"
}您只需禁用客户平台的加密密钥即可关闭密封的客户端结果,禁用之后,SDK-API将不再返回加密的设备详情。禁用加密密钥之前,请确保您的集成可以支持处理未加密的数据结果
