博客 / 詳情

返回

設備指紋系列--基礎篇

基礎概念

618還沒開始,但是又好像已經結束了......在這種電商大促的大節日前,電商行業客户一般會提前找到合適的設備指紋產品,去防止被“薅禿”。因為,黑灰產擁有專業的設備牧場,通過使用模擬器、刷機改機等手段,批量、反覆地利用終端設備作案。對互聯網場景下的金融、電商等行業,進行惡意爬取、虛假註冊、賬號盜用、薅羊毛、推廣作弊等其他惡意行為。

image.png

而設備指紋,通過用户上網設備的硬件、網絡、環境等設備特徵信息, 生成可抗黑產破解的設備唯一標識。作為縱深防禦風控體系下的重要工具,可實現對終端設備上的風險環境識別、風險檢測及行為風險分析。

名稱 釋義
AppId 公鑰,長度為32位字符串,接入渠道唯一標識。開通服務後可在設備指紋的二級菜單“應用管理”中獲取,AppId在客户端接入時使用。
AppSecret 私鑰,長度為32位字符串,與公鑰對應,開通服務後可在設備指紋的二級菜單“應用管理”中獲取,請妥善保管,勿泄漏給他人 。AppSecret在後台查詢設備詳情時使用。
token 設備指紋SDK採集上報後返回的標識,token不是設備指紋,通過token可以查詢設備指紋
hardId 設備指紋
用户前端 Web端或集成SDK的Android端、iOS端
用户後端 指企業的後台服務器

交互流程

image.png

  • 客户端接入,業務客户端需要集成指紋客户端SDK,包括安卓,iOS,H5,小程序等;通過客户端SDK可以獲取到設備指紋token(注:token不是設備指紋)。
  • 業務接口擴展,業務客户端在需要設備指紋token的時候,可以通過相應的api獲取到。業務接口需要把前端拿到的指紋token一併傳入後台。
  • 後台接入,根據提供的後端SDK來查詢設備詳細信息,SDK涵蓋Java,PHP等。

PS:因終端用户的設備網絡環境和設備版本等因素,設備指紋採集率並不能一定達到100%,可能會存在極少部分未能正常採集到的情況。所以在集成指紋服務的時候,請儘量避免對指紋信息強依賴。

設備指紋的獲取

常見的設備指紋獲取方式:

  1. User-Agent 字符串:在 Web 瀏覽器環境中,可以通過讀取用户代理(User-Agent)字符串來獲取設備信息,包括操作系統、瀏覽器版本等。例如,在 JavaScript 中,可以使用 navigator.userAgent 來獲取 User-Agent 字符串。
  2. IP 地址:通過獲取設備的 IP 地址,可以對設備進行初步的區分。然而,IP 地址並非唯一標識設備的可靠方式,因為多個設備可能共享相同的 IP 地址(例如,通過 NAT 網絡)。
  3. 操作系統信息:設備的操作系統信息也可以用於構建設備指紋。在不同的操作系統中,可能有各種系統調用、API 或命令可以獲取該信息。
  4. 瀏覽器或應用程序特徵:可以通過檢查瀏覽器或應用程序的特定特徵來獲取設備指紋。例如,在 Web 瀏覽器中,可以使用 JavaScript 檢測瀏覽器的插件、字體、屏幕分辨率等信息。
  5. 硬件信息:獲取硬件信息也可以用於設備指紋的生成。例如,使用 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 "";
        }
    }
}

以上。

如需要免費體驗設備指紋:頂象設備指紋

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.