基礎概念
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 "";
}
}
}
以上。
如需要免費體驗設備指紋:頂象設備指紋