JavaScript奇技淫巧:隐形字符
字数 765 2025-08-11 21:26:39
JavaScript隐形字符技术详解
一、技术概述
隐形字符技术是一种利用Unicode零宽字符实现字符串不可见效果的方法,可以应用于:
- 代码加密
- 数据加密
- 文字隐藏
- 内容保密
- 隐形水印
二、零宽字符原理
零宽字符是Unicode中不可见、不可打印的字符,主要用于调整字符显示格式:
| 字符类型 | Unicode编码 | 用途 |
|---|---|---|
| 空格符 | U+200B | 较长字符的换行分隔 |
| 非断空格符 | U+FEFF | 阻止特定位置换行分隔 |
| 连字符 | U+200D | 使不连字字符产生连字效果 |
| 断字符 | U+200C | 阻止字符间的连字效果 |
| 左至右符 | U+200E | 规定文字方向为左至右 |
| 右至左符 | U+200F | 规定文字方向为右至左 |
三、实现方法
1. 字符串转二进制
function text_2_binary(text){
return text.split('').map(function(char){
return char.charCodeAt(0).toString(2)
}).join(' ');
}
2. 二进制转隐形字符
function binary_2_hidden_text(binary){
return binary.split('').map(function (binary_num){
var num = parseInt(binary_num, 10);
if (num === 1) {
return '\u200b'; // 1转为零宽空格
} else if(num===0) {
return '\u200c'; // 0转为零宽非连接符
}
return '\u200d'; // 空格转为零宽连接符
}).join('\ufeff') // 使用零宽非断空格作为分隔符
}
3. 使用示例
var text = "jshaman是专业且强大的JS代码混淆加密工具";
var binary_text = text_2_binary(text);
var hidden_text = binary_2_hidden_text(binary_text);
console.log("原始字符串:",text);
console.log("二进制:",binary_text);
console.log("隐藏字符:",hidden_text,"隐藏字符长度:",hidden_text.length);
四、还原方法
1. 隐形字符转二进制
function hidden_text_2_binary(string){
return string.split('\ufeff').map(function(char){
if (char === '\u200b') {
return '1';
} else if(char === '\u200c') {
return '0';
}
return ' ';
}).join('')
}
2. 二进制转原始字符串
function binary_2_Text(binaryStr){
var text = ""
binaryStr.split(' ').map(function(num){
text += String.fromCharCode(parseInt(num, 2));
}).join('');
return text.toString();
}
3. 使用示例
console.log("隐形字符转二进制:",hidden_text_2_binary(hidden_text));
console.log("二进制转原始字符:",binary_2_Text(hidden_text_2_binary(hidden_text)));
五、安全性增强
为防止解密函数被分析,建议使用JS代码混淆工具(如JShaman)对解密函数进行混淆加密。
混淆加密后的代码功能不变,但可读性大幅降低,增强了安全性。
六、应用场景
- 前后端通信:将敏感信息以隐形字符形式传输
- 代码保护:隐藏关键字符串,防止直接分析
- 水印嵌入:在文本中嵌入不可见标识信息
- 数据存储:以隐形形式存储敏感数据
七、注意事项
- 隐形字符虽然不可见,但仍占用存储空间
- 某些编辑器可能会显示零宽字符的特殊标记
- 复制粘贴时需确保零宽字符不被丢失
- 不同系统对零宽字符的处理可能略有差异
通过掌握这种隐形字符技术,开发者可以在JavaScript应用中实现更高级别的信息隐藏和保护。