zuluoaaa / blog

blog
6 stars 0 forks source link

关于字体加密的机制 #10

Open zuluoaaa opened 2 years ago

zuluoaaa commented 2 years ago

什么是字体加密

不使用公开的字体,而是自己创建一份私有的字体

一些基础的知识

一个字符串在计算机内是怎么表示的?

答案是数字,用某个数字去代指某个字符串,这个数字即是

我们日常了解的unicode字符集,又或者utf8,gkb……等各种编码。

举个例子,我们用将中文转成unicode字符(比如 “你”这个字符,转换成 unicode 是 “\u4f60”

这是一个16进制字符串,如果我们把它转成10进制,结果是“\u20320” ,再去掉 unicode的统一前缀

“20320”

“你” 在unicode 字符集里面对应的数字是 “20320”

20320的其实是就是索引,

一个简单的理解,即是字符集是一个大数组,数组内的每一项对应一个字符的矢量图形

当我们拿到数字,又明白他属于哪个字符集的,那么就能渲染出正确的字符(常见的乱码错误就是因为字符集不正确导致的)

加密原理

我们自己在现有的字符集里面新增一些项(即是我们的加密字体),传给前端的时候,将加密字体添加到浏览器的当前字符集,然后在渲染位置使用unicode字符进行渲染,这个unicode字符所对应的就是我们刚刚新增的字符集,

解密原理

拿到unicode的同时,一并拿到字符集的新增项,将unicode和这些新增项,一一对应起来,才能拿到真实的字符数据

如果是浏览器,那么很简单,因为字体内容本身是无法加密的(否则浏览器无法识别),而且要明文传给前端。

拿到字体内容,通过opentype等工具,对字体进行解压,拿到一个大数组及内每一项所对应的矢量数据

将矢量数据绘制出来,数据量比较少的话,可以人工肉眼去标记每个矢量图形所对应的字符串;

数据量多的话,将绘制出来的矢量图形,调用第三方文字识别API或者文字特征识别库等等,拿到对应字符;