Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于字体加密的机制 #10

Open
zuluoaaa opened this issue Feb 6, 2022 · 0 comments
Open

关于字体加密的机制 #10

zuluoaaa opened this issue Feb 6, 2022 · 0 comments

Comments

@zuluoaaa
Copy link
Owner

zuluoaaa commented Feb 6, 2022

什么是字体加密

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

一些基础的知识

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

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

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

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

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

“20320”

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

20320的其实是就是索引,

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

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

加密原理

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

解密原理

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

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant