乐趣区

关于安全:设备指纹系列基础篇

根底概念

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%,可能会存在极少局部未能失常采集到的状况。所以在集成指纹服务的时候,请尽量避免对指纹信息强依赖。

设施指纹的获取

常见的设施指纹获取形式:

  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 "";
        }
    }
}

以上。

如须要收费体验设施指纹:顶象设施指纹

退出移动版