Skip to content

Commit eff3bef

Browse files
committed
feat(device): 添加画布指纹功能
- 实现了画布指纹功能,用于设备识别 - 画布指纹基于不同设备的硬件和浏览器实现差异 - 新增 getCanvasFingerprint 方法获取画布指纹 - 更新了相关文件以支持新功能
1 parent e93f7cf commit eff3bef

File tree

6 files changed

+60
-6
lines changed

6 files changed

+60
-6
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# 更新日志
22

3+
## 4.2.12 - 2025/03/02
4+
5+
- 增加画布指纹(原理:不同设备的硬件以及浏览器实现会导致画布渲染结果存在细微差异。)。
6+
37
## 4.2.11 - 2024/12/01
48

59
- 阿里云 Maven 仓库问题。

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
- 码云(GitEE):`https://gitee.com/li_yu_jiang/Android_CN_OAID`
1818
- Demo:[https://github.com/gzu-liyujiang/Android_CN_OAID/blob/master/demo.apk](/demo.apk)
1919

20-
【抱歉!各位小伙伴,从2022年开始我已经没做安卓开发了,项目虽然已经趋于稳定,不过需要大家参与维护,多提PullRequest,我目前已经没法贡献代码了】
21-
2220
## 接入指引
2321

2422
最新版本:[![jitpack](https://jitpack.io/v/gzu-liyujiang/Android_CN_OAID.svg)](https://jitpack.io/#gzu-liyujiang/Android_CN_OAID)
@@ -143,6 +141,8 @@ dependencies {
143141
// 获取OAID/AAID失败
144142
}
145143
});
144+
// 获取画布指纹
145+
DeviceIdentifier.getCanvasFingerprint();
146146
```
147147

148148
## 混淆规则

app/src/main/java/com/github/gzuliyujiang/fallback/MainActivity.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,17 +117,21 @@ private void obtainDeviceId() {
117117
@Override
118118
public void onOAIDGetComplete(String result) {
119119
// 不同厂商的OAID/AAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一
120-
builder.append("OAID/AAID: ").append(result);
120+
builder.append("OAID/AAID: ").append(result).append("\n");
121121
tvDeviceIdResult.setText(builder);
122122
}
123123

124124
@Override
125125
public void onOAIDGetError(Exception error) {
126126
// 获取OAID/AAID失败
127-
builder.append("OAID/AAID: ").append(error);
127+
builder.append("OAID/AAID: ").append(error).append("\n");
128128
tvDeviceIdResult.setText(builder);
129129
}
130130
});
131+
builder.append("CanvasFingerprint: ");
132+
// 获取帆布指纹,不会为空,具有一定的唯一性,但不能完全保证全球唯一。
133+
builder.append(DeviceIdentifier.getCanvasFingerprint());
134+
builder.append("\n");
131135
}
132136

133137
private String obtainDeviceInfo() {

gradle/wrapper/gradle-wrapper.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#Sun Dec 01 12:12:49 CST 2024
1515
distributionBase=GRADLE_USER_HOME
1616
distributionPath=wrapper/dists
17-
#distributionUrl=file:///G:/\u540C\u6B65\u7A7A\u95F4/\u7F16\u7A0B/\u5F00\u53D1\u5DE5\u5177/gradle-8.9-bin.zip
18-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
17+
#distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
18+
distributionUrl=https\://mirrors.nju.edu.cn/gradle/gradle-8.9-all.zip
1919
zipStoreBase=GRADLE_USER_HOME
2020
zipStorePath=wrapper/dists

library/src/main/java/com/github/gzuliyujiang/oaid/DeviceID.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
import android.content.Context;
1919
import android.content.SharedPreferences;
2020
import android.content.pm.PackageManager;
21+
import android.graphics.Bitmap;
22+
import android.graphics.Canvas;
23+
import android.graphics.Color;
24+
import android.graphics.Paint;
25+
import android.graphics.Typeface;
2126
import android.media.MediaDrm;
2227
import android.os.Build;
2328
import android.os.Environment;
@@ -516,6 +521,29 @@ public static String calculateHash(String str, String algorithm) {
516521
}
517522
}
518523

524+
/**
525+
* 获取画布指纹。原理:不同设备的硬件以及浏览器实现会导致画布渲染结果存在细微差异。
526+
*/
527+
public static String getCanvasFingerprint() {
528+
int width = 200;
529+
int height = 100;
530+
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
531+
Canvas canvas = new Canvas(bitmap);
532+
canvas.drawColor(Color.WHITE);
533+
Paint paint = new Paint();
534+
paint.setColor(Color.BLACK);
535+
paint.setTextSize(18);
536+
paint.setTypeface(Typeface.SERIF);
537+
canvas.drawText("羡民@李裕江", 10, 50, paint);
538+
int[] pixels = new int[width * height];
539+
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
540+
StringBuilder pixelData = new StringBuilder();
541+
for (int pixel : pixels) {
542+
pixelData.append(pixel);
543+
}
544+
return calculateHash(pixelData.toString(), "SHA-1");
545+
}
546+
519547
private static class Holder {
520548
static final DeviceID INSTANCE = new DeviceID();
521549
}

library/src/main/java/com/github/gzuliyujiang/oaid/DeviceIdentifier.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public final class DeviceIdentifier {
3535
private static volatile String widevineId = null;
3636
private static volatile String pseudoId = null;
3737
private static volatile String guid = null;
38+
private static volatile String canvasFingerprint = null;
3839

3940
private DeviceIdentifier() {
4041
super();
@@ -274,4 +275,21 @@ public static String getGUID(Context context) {
274275
return guid;
275276
}
276277

278+
/**
279+
* 获取画布指纹。具有一定的唯一性,但不能完全保证全球唯一。
280+
*/
281+
public static String getCanvasFingerprint() {
282+
if (canvasFingerprint == null) {
283+
synchronized (DeviceIdentifier.class) {
284+
if (canvasFingerprint == null) {
285+
canvasFingerprint = DeviceID.getCanvasFingerprint();
286+
}
287+
}
288+
}
289+
if (canvasFingerprint == null) {
290+
canvasFingerprint = "";
291+
}
292+
return canvasFingerprint;
293+
}
294+
277295
}

0 commit comments

Comments
 (0)