微信小程序设备指纹技术详解与实践

1,310 阅读5分钟

摘要

本文利用了微信小程序的 wx.getWindowInfo、wx.getDeviceInfo 和 wx.getAppBaseInfo API,借助组合信息生成设备指纹的方法,解决了用户行为分析和风险控制问题,具有提升用户体验和安全性的技术价值。

关键词

设备指纹;微信小程序;用户行为分析;风险控制;

导语

随着移动互联网的快速发展,设备指纹技术在用户身份识别、安全防护等方面发挥着越来越重要的作用。特别是在微信小程序中,设备指纹可以帮助开发者实现更精准的用户行为分析和风险控制。本文将详细介绍如何在微信小程序中实现设备指纹技术,并结合实际案例进行分析,为一线研发工作者提供实用的技术指导。

1. 问题分析

1.1. 设备指纹的重要性

设备指纹技术通过对设备的硬件和软件信息进行综合分析,生成一个唯一的标识符,用于识别不同的设备。在微信小程序中,设备指纹可以应用于以下几个方面:

  • 用户行为分析:通过设备指纹跟踪用户的访问行为,帮助分析用户偏好。
  • 风险控制:检测异常登录行为,防止恶意攻击。
  • 广告投放:基于设备指纹进行精准广告投放,提高转化率。

1.2. 微信小程序中的设备指纹实现挑战

虽然设备指纹技术在Web端已有广泛应用,但在微信小程序中实现设备指纹仍面临一些挑战:

  • API限制:微信小程序提供了有限的API接口,无法直接访问所有硬件信息。
  • 数据隐私:需要遵守微信小程序的数据隐私政策,确保用户信息安全。
  • 性能优化:设备指纹的生成过程需要高效且低耗,不影响用户体验。

2. 解决问题

2.1. 设备指纹生成方法

为了在微信小程序中实现设备指纹,我们需要综合使用微信小程序提供的API接口,包括 wx.getWindowInfowx.getDeviceInfowx.getAppBaseInfo。下面详细介绍每个API的作用及其使用方法。

2.1.1. 获取窗口信息

wx.getWindowInfo 用于获取当前页面的窗口信息,包括屏幕尺寸、像素比等。

2.1.2. 获取设备信息

wx.getDeviceInfo 用于获取设备的基本信息,包括品牌、型号、系统版本等。

2.1.3. 获取应用基础信息

wx.getAppBaseInfo 用于获取小程序的基础信息,包括SDK版本、语言设置等。

2.2. 组合信息生成设备指纹

通过组合上述信息,我们可以生成一个唯一的设备指纹。具体步骤如下:

  1. 收集信息:获取窗口信息、设备信息和应用基础信息。
  2. 组合信息:将所有信息按照一定规则组合成字符串。
  3. 生成哈希值:使用哈希算法(如MD5)生成唯一的哈希值作为设备指纹。
createFingerprint(windowInfo, deviceInfo, appBaseInfo) {
		// 组合信息
		/**
		 * windowInfo.pixelRatio--设备像素比
		 * windowInfo.screenWidth--屏幕宽度
		 * windowInfo.screenHeight--屏幕高度
		 * deviceInfo.brand--设备品牌
		 * deviceInfo.model--设备型号
		 * deviceInfo.system--操作系统及版本
		 * deviceInfo.platform--客户端平台
		 * deviceInfo.cpuType--设备CPU型号
		 * deviceInfo.memorySize--设备内存大小
		 * appBaseInfo.SDKVersion--客户端基础库版本
		 * appBaseInfo.language--微信设置的语言
		 * appBaseInfo.version--微信版本号
		 * appBaseInfo.theme--当前系统的主题
		 * appBaseInfo.fontSizeSetting--微信字体大小
		 * 
		 */
    const infoString = `${windowInfo.pixelRatio}-${windowInfo.screenWidth}-
    ${windowInfo.screenHeight}-${deviceInfo.brand}-
    ${deviceInfo.model}-${deviceInfo.system}-
    ${deviceInfo.platform}-${deviceInfo.cpuType}-
    ${deviceInfo.memorySize}-${appBaseInfo.SDKVersion}-
    ${appBaseInfo.language}-${appBaseInfo.version}-
    ${appBaseInfo.theme}-${appBaseInfo.fontSizeSetting}`;

    // 生成 MD5 哈希值
    const hash = this.md5(infoString);

    return hash;
}

2.3. 存储和使用设备指纹

生成设备指纹后,我们需要将其存储起来以便后续使用。可以使用 wx.setStorageSync 将设备指纹存储在本地缓存中。

storeFingerprint(fingerprint) {
  wx.setStorageSync('deviceFingerprint', fingerprint);
  console.log('设备指纹已存储:', fingerprint);
}

getStoredFingerprint() {
  return wx.getStorageSync('deviceFingerprint') || null;
}

3. 案例分析

3.1. 用户行为分析案例

假设我们需要在微信小程序中实现用户行为分析功能,通过设备指纹跟踪用户的访问行为。具体步骤如下:

  1. 生成设备指纹:在用户首次访问时生成设备指纹并存储。
  2. 记录用户行为:每次用户访问时,读取设备指纹并记录其行为数据。
  3. 数据分析:将收集到的行为数据进行分析,生成用户画像。
//页面代码
Page({
    onLoad:function(options){
        const deviceFingerprint = new DeviceFingerprint();
        this.generateAndstoreFingerprint(deviceFingerprint);
    },
    generateAndstoreFingerprint:function(deviceFingerprint){
        deviceFingerprint.generateFingerprint()
            .then(fingerprint => {
                deviceFingerprint.storeFingerprint();
                console.Log('设备指纹:',fingerprint);
                //记录用户行为
                this.recordUserBehavior(fingerprint);
        })
        .catch(error => {
            console.error('生成设备指纹失败:',error);
        });
    },

    recordUserBehavior:function(fingerprint){
        const behaviorData = {
            fingerprint:fingerprint,
            timestamp:Date.now(),
            page:'index'
        };
    
        //存储行为数据
        wx.setStorageSync('userBehavior',behaviorData);
        console.log('用户行为已记录:',behaviorData);
    }
});

3.2. 风险控制案例

假设我们需要在微信小程序中实现风险控制功能,通过设备指纹检测异常登录行为。具体步骤如下:

  1. 生成设备指纹:在用户登录时生成设备指纹并存储。
  2. 检测异常登录:每次用户登录时,读取设备指纹并与历史记录进行对比。
  3. 报警处理:如果发现异常登录行为,则触发报警机制。
generateAndStoreFingerprint:function(deviceFingerprint){
    return deviceFingerprint.generateFingerprint()
        .then(fingerprint => {
            deviceFingerprint.storeFingerprint();
            console.log('设备指纹:',fingerprint);
            return fingerprint;
        });
},
detectAnomalyLogin:function(fingerprint,username,password){
    const storedFingerprint = deviceFingerprint.getstoredFingerprint();
    if (fingerprint !== storedFingerprint){
        console.error('异常登录行为:',fingerprint);
        //触发报警机制
        this.triggerAlarm(username,password);
    }else{
        console.log('登录成功:',username);
    }
},
triggerAlarm:function(username,password){
    //发送报警信息
    wx.request({
        url:'https://yourserver.com/alarm',
        data:{
            username:username,
            password:password,
            fingerprint:fingerprint
        },
        method:'POST',
        success:res => {
            console.log('报警成功:',res);
        },
        fail:err => {
            console.error('报警失败:',err);
        }
    });
}

生成设备指纹

以下参数进行组合通过MD5生成哈希值作为设备指纹

该设备指纹不同于常规意义的设备指纹,可能会存在重复的概率。

对重复概率的理解: 通过对这些信息的组合,如果生成的设备指纹重复,可以认为重复的设备为比较相近的一类人群,在求职招聘场景下,对同一类人群做分析推荐处理是比较合理的

* windowInfo.pixelRatio--设备像素比

* windowInfo.screenWidth--屏幕宽度

* windowInfo.screenHeight--屏幕高度

* deviceInfo.brand--设备品牌

* deviceInfo.model--设备型号

* deviceInfo.system--操作系统及版本

* deviceInfo.platform--客户端平台

* deviceInfo.cpuType--设备CPU型号

* deviceInfo.memorySize--设备内存大小

* appBaseInfo.SDKVersion--客户端基础库版本

* appBaseInfo.language--微信设置的语言

* appBaseInfo.version--微信版本号

* appBaseInfo.theme--当前系统的主题

* appBaseInfo.fontSizeSetting--微信字体大小