基础概念
618还没开始,但是又好像已经结束了…在这种电商大促的大节日前,电商行业客户一般会提前找到合适的设备指纹产品,去防止被“薅秃”。因为,黑灰产拥有专业的设备牧场,通过使用模拟器、刷机改机等手段,批量、反复地利用终端设备作案。对互联网场景下的金融、电商等行业,进行恶意爬取、虚假注册、账号盗用、薅羊毛、推广作弊等其他恶意行为。
而设备指纹,通过用户上网设备的硬件、网络、环境等设备特征信息, 生成可抗黑产破解的设备唯一标识。作为纵深防御风控体系下的重要工具,可实现对终端设备上的风险环境识别、风险检测及行为风险分析。
名称 | 释义 |
---|---|
AppId | 公钥,长度为32位字符串,接入渠道唯一标识。开通服务后可在设备指纹的二级菜单“应用管理”中获取,AppId在客户端接入时使用。 |
AppSecret | 私钥,长度为32位字符串,与公钥对应,开通服务后可在设备指纹的二级菜单“应用管理”中获取,请妥善保管,勿泄漏给他人 。AppSecret在后台查询设备详情时使用。 |
token | 设备指纹SDK采集上报后返回的标识,token不是设备指纹,通过token可以查询设备指纹 |
hardId | 设备指纹 |
用户前端 | Web端或集成SDK的Android端、iOS端 |
用户后端 | 指企业的后台服务器 |
交互流程
-
客户端接入,业务客户端需要集成指纹客户端SDK,包括安卓,iOS,H5,小程序等;通过客户端SDK可以获取到设备指纹token(注:token不是设备指纹)。
-
业务接口扩展,业务客户端在需要设备指纹token的时候,可以通过相应的api获取到。业务接口需要把前端拿到的指纹token一并传入后台。
-
后台接入,根据提供的后端SDK来查询设备详细信息,SDK涵盖Java,PHP等。
PS:因终端用户的设备网络环境和设备版本等因素,设备指纹采集率并不能一定达到100%,可能会存在极少部分未能正常采集到的情况。所以在集成指纹服务的时候,请尽量避免对指纹信息强依赖。
设备指纹的获取
常见的设备指纹获取方式:
- User-Agent 字符串:在 Web 浏览器环境中,可以通过读取用户代理(User-Agent)字符串来获取设备信息,包括操作系统、浏览器版本等。例如,在 JavaScript 中,可以使用
navigator.userAgent
来获取 User-Agent 字符串。 - IP 地址:通过获取设备的 IP 地址,可以对设备进行初步的区分。然而,IP 地址并非唯一标识设备的可靠方式,因为多个设备可能共享相同的 IP 地址(例如,通过 NAT 网络)。
- 操作系统信息:设备的操作系统信息也可以用于构建设备指纹。在不同的操作系统中,可能有各种系统调用、API 或命令可以获取该信息。
- 浏览器或应用程序特征:可以通过检查浏览器或应用程序的特定特征来获取设备指纹。例如,在 Web 浏览器中,可以使用 JavaScript 检测浏览器的插件、字体、屏幕分辨率等信息。
- 硬件信息:获取硬件信息也可以用于设备指纹的生成。例如,使用 JavaScript 可以读取设备的 CPU 信息、GPU 信息、设备的唯一标识符(如 Android 的 IMEI 或 iOS 的广告标识符)等。
基础代码:
import android.os.Build;
import android.provider.Settings;
import android.content.Context;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class DeviceFingerprint {
// 获取设备指纹信息
public static String getDeviceFingerprint(Context context) {
StringBuilder fingerprint = new StringBuilder();
// 获取设备的 Android ID
String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
fingerprint.append(androidId);
// 获取设备的序列号
String serial = Build.SERIAL;
fingerprint.append(serial);
// 获取设备的硬件信息
String hardware = Build.HARDWARE;
fingerprint.append(hardware);
// 获取设备的制造商和型号
String manufacturer = Build.MANUFACTURER;
String model = Build.MODEL;
fingerprint.append(manufacturer).append(model);
// 获取设备的唯一标识符
String uniqueId = getUniqueId();
fingerprint.append(uniqueId);
// 对设备指纹信息进行哈希处理
String hashedFingerprint = hashString(fingerprint.toString());
return hashedFingerprint;
}
// 生成设备的唯一标识符
private static String getUniqueId() {
String uniqueId = "";
try {
// 获取设备的唯一标识符(可根据需求自定义)
// 例如,可以使用 IMEI(需要权限)或其他标识符
uniqueId = "YOUR_UNIQUE_ID";
} catch (Exception e) {
e.printStackTrace();
}
return uniqueId;
}
// 对字符串进行哈希处理
private static String hashString(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = digest.digest(input.getBytes());
StringBuilder stringBuilder = new StringBuilder();
for (byte b : hashBytes) {
stringBuilder.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
}
return stringBuilder.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
}
}
以上。
如需要免费体验设备指纹:顶象设备指纹