零宽字符是一种在浏览器中不打印的字符,大致相当于display-none,在许多文本应用中也不显示,比如邮箱、QQ、微信、文本编辑器等;
本文讲解了如何使用零宽字符实现文本隐藏和加密;
使用零宽字符实现文本隐藏加密
什么是零宽字体
零宽字符是一种在浏览器中不打印的字符,大致相当于
display: none
,在许多文本应用中也不显示,比如邮箱、QQ、微信、文本编辑器等;这里有三种零宽字符 – 零宽空格、零宽连字、零宽不连字
零宽字符在浏览器中对应的转义字符: 零宽空格 --- ​ 零宽不连字 --- ‌ 零宽连字 --- ‍
使用零宽字体加密
对于零宽字体的加密可以使用摩斯密码:
摩斯电码采用长短两种符号进行文本加密,通过字典进行加密和解码,摩斯电码字典如下所示:
字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 |
ㅤ | ㅤ | ㅤ | ㅤ |
如果我们使用
/
作为分隔符,则将 morse
这个单词转换为摩斯电码就是:morse -> --/---/.-./.../.
现在我们再将
/
替换为零宽空格; -
替换问零宽连字;.
替换为零宽不连字/ --> ​ . --> ‌ - --> ‍
那么就能将morse这个单词转换为如下零宽字符
‍‍​‍‍‍​‌‍‌​‌‌‌​‌
将这段零宽字符粘贴进一个HTML文件当中
<p>前</p> <div>‍‍​‍‍‍​‌‍‌​‌‌‌​‌</div> <p>后</p>
在浏览器中打开这个HTML文件,你只能看到
"前后"
两个字!到这,使用零宽字符实现文本隐藏加密的原理已经可见一斑了!
中文字符加密支持
要实现中文加解密,主要思路是先对文本进行正则匹配,将其中的中文进行Unicode转码,转码后整段文本就变成了:字母、数字、
\
的组合,我们在加解密字典中加上对 \
的支持,即可!加密使用方式
注意:
- pc版QQ不支持零宽字符,会显示空格,但手机版不会;
- 中文转码长度大约是相同长度英文字符的6倍;
- 零宽字符虽然看不见但是,但也是一个个字符,所以删除含有零宽字符的文本时,删到零宽字符时会删不动要把零宽字符全部删完才能接着往下删;
在线地址:
上面的网站都可以实现零宽字符加密,大家不妨可以试试!
应用场景
① 存储隐藏信息
零宽字体可以用来存储隐藏信息, 比如:隐藏加密存储比特币钱包,或者在你的代码里埋下一个彩蛋:
② 秘密传达消息
零宽字符在大部分应用都支持,pc版QQ会显示零宽字符,但移动端不显示;
你可以将密文加密到普通文本中,然后邮件发送,表面上看起来是普通文本,只有对方复制明文进行解密后才能看出隐藏信息!
③ 为文章添加隐藏水印
你可以在你写的文章插入隐藏字符,将作者信息嵌入其中;
当别人复制你的文章时,并不会发现这篇文章已经被你悄悄打下水印;
在写代码时的坑
零宽字体通常是不可见的,所以在写代码的时候,如果在代码中加入了这些零宽字符,是非常坑的!
所以在打印日志的时候,推荐使用:
fmt.Printf("%#v", info)
来打印日志!附录
参考文章: