在日常开发中,经常需要对用户密码、配置信息或通信数据进行保护。字符串加密是最基础也最常用的安全手段之一。虽然市面上有成熟的加密库,但了解基本的加密算法实现,能帮助我们更灵活地应对特定场景。
为什么需要自己实现加密?
比如你写了个小工具,用来保存Wi-Fi密码或账号口令,不想依赖外部库,又希望数据不被轻易查看。这时候,一个轻量级的字符串加密算法就能派上用场。它不需要达到军用级别,但起码能让普通人打不开明文。
从简单的异或加密开始
异或(XOR)是一种最基础但有效的位操作加密方式。它的特点是两次相同操作可还原原文,适合做对称加密。比如你用密钥和每个字符异或一遍,得到密文;再用同一密钥异或一遍,就变回原文。
function xorEncryptDecrypt(text, key) {
let result = '';
for (let i = 0; i < text.length; i++) {
result += String.fromCharCode(text.charCodeAt(i) ^ key.charCodeAt(i % key.length));
}
return result;
}
// 使用示例
const plainText = 'hello123';
const secretKey = 'mypassword';
const encrypted = xorEncryptDecrypt(plainText, secretKey);
console.log('加密后:', encrypted);
const decrypted = xorEncryptDecrypt(encrypted, secretKey);
console.log('解密后:', decrypted); // 输出 hello123
这个方法简单高效,适合本地临时加密。但要注意,异或加密容易被频率分析破解,不能用于网络传输等高风险场景。
进阶一点:Base64 + 移位混淆
如果你想要稍微复杂点的效果,可以结合 Base64 编码和字符移位。先将字符串转成 Base64,再对每一位字符按规则偏移,比如加个固定数再取模。
function simpleObfuscate(str, shift = 5) {
const base64 = btoa(unescape(encodeURIComponent(str)));
let result = '';
for (let i = 0; i < base64.length; i++) {
result += String.fromCharCode(base64.charCodeAt(i) + shift);
}
return result;
}
function simpleDeobfuscate(obfuscatedStr, shift = 5) {
let base64 = '';
for (let i = 0; i < obfuscatedStr.length; i++) {
base64 += String.fromCharCode(obfuscatedStr.charCodeAt(i) - shift);
}
return decodeURIComponent(escape(atob(base64)));
}
// 示例
const message = '敏感信息不要外泄';
const encoded = simpleObfuscate(message);
console.log('混淆后:', encoded);
const decoded = simpleDeobfuscate(encoded);
console.log('还原后:', decoded);
这种方式不算真正加密,但能有效防止一眼看穿内容,适合用在配置文件或日志脱敏中。
实际应用场景
比如你在写一个记事本小程序,想让用户输入的内容本地加密保存。可以用上面的方法生成一个“加密笔记”功能。用户输入密码后才能查看原文,关闭后自动显示星号。既不影响体验,又增加了一层防护。
再比如团队内部传一些临时口令,直接发明文怕被截获,用微信发个异或加密的结果,对方拿脚本一解就行,省事又不至于太裸。
别忘了密钥管理
再强的算法,密钥写死在代码里也是白搭。如果真要提升安全性,建议把密钥交给用户输入,或者用环境变量加载。哪怕只是弹个输入框让输密码,也比硬编码强得多。
另外,所有这些自实现加密都不该替代 HTTPS、AES 等标准方案。它们的意义在于快速、轻量、可控,而不是替代专业安全体系。