前端敏感信息隐藏的实践与防踩坑指南

南宫文仙 安全 阅读 2,299
赞 4 收藏
二维码
手机扫码查看
反馈

为什么我要对比这几个方案?

最近在做一个项目,涉及到用户敏感信息的隐藏和保护。比如用户的身份证号、手机号这些数据,在界面上需要部分隐藏。这种需求其实很常见,但具体实现方式却有不少坑。我试了几种常见的技术方案,最后总结了一下各自的优缺点,想分享给大家。

前端敏感信息隐藏的实践与防踩坑指南

说白了,我的目标很简单:既要保证敏感信息不被直接暴露,又不能影响用户体验,还得方便开发和维护。废话不多说,直接进入正题。

谁更灵活?谁更省事?

先说结论:我比较喜欢用前端正则处理的方式,虽然它不是最安全的,但在大多数场景下足够用了,而且代码简单好维护。如果你追求更高的安全性,可以考虑后端返回脱敏数据的方案,但这会增加前后端沟通成本。

下面详细聊聊几种方案:

  • 前端正则替换
  • 后端返回脱敏数据
  • 加密解密方案

前端正则替换:简单粗暴,亲测有效

这个方案的核心思想是,通过正则表达式在前端对敏感信息进行替换。比如把手机号中间四位换成星号(*)。代码如下:

function maskPhoneNumber(phone) {
  return phone.replace(/(d{3})d{4}(d{4})/, "$1****$2");
}

const phoneNumber = "13812345678";
console.log(maskPhoneNumber(phoneNumber)); // 输出:138****5678

这段代码非常简单,正则匹配手机号的前三位和后四位,然后把中间四位替换成星号。类似的逻辑也可以用在身份证号、银行卡号等其他敏感信息上。

优点很明显:实现起来快,改动成本低。如果需求变化了,比如要隐藏更多位数,改个正则就行。而且所有逻辑都在前端完成,后端不用操心。

缺点呢?最大的问题就是安全性不够高。因为原始数据还是传到了前端,虽然界面显示的是脱敏后的信息,但懂点技术的人打开浏览器调试工具,就能看到完整的未脱敏数据。所以这种方案适合那些对安全性要求不高的场景。

踩坑提醒:别忘了测试各种边界情况,比如空字符串、非数字字符、超长或超短的号码等。我之前就遇到过一个手机号字段为空的情况,结果页面上直接显示了一个乱七八糟的星号串,尴尬得很。

后端返回脱敏数据:更安全,但麻烦点

第二种方案是让后端直接返回脱敏后的数据。这样前端拿到的就是已经处理好的数据,完全不需要自己再做任何操作。举个例子:

{
  "phoneNumber": "138****5678"
}

后端可能用类似这样的逻辑:

def mask_phone_number(phone):
    if len(phone) == 11:
        return phone[:3] + "****" + phone[-4:]
    return phone

# 示例调用
masked_phone = mask_phone_number("13812345678")
print(masked_phone)  # 输出:138****5678

这种方式的优点是安全性更高,因为原始数据根本不会传到前端。即使有人打开了调试工具,也只能看到脱敏后的数据。

不过缺点也很明显:增加了前后端的沟通成本。每次有新的字段需要脱敏,都得跟后端同学对接一次。而且后端的逻辑也变复杂了,尤其是当字段很多的时候,代码会显得很冗长。

还有一点需要注意:如果你的后端接口已经被多个地方复用,贸然修改返回值可能会导致其他模块出问题。所以这种方案更适合新项目,或者那些对接口改动影响范围可控的场景。

加密解密方案:看着高大上,实际有点鸡肋

最后一个方案是用加密算法对敏感信息进行加密,前端拿到后再解密并显示脱敏内容。听起来很高大上,但实际上我觉得这玩意有点鸡肋。

比如可以用AES加密:

// 加密示例(Node.js环境)
const crypto = require('crypto');

function encrypt(text, key) {
  const cipher = crypto.createCipher('aes-256-cbc', key);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return encrypted;
}

const originalData = "13812345678";
const key = "my-secret-key-123"; // 密钥
const encryptedData = encrypt(originalData, key);
console.log(encryptedData); // 输出加密后的字符串

前端拿到加密数据后,还需要再解密并脱敏显示。整个流程看起来挺复杂的,对吧?确实如此。

优点是:安全性最高,原始数据全程加密,即使被抓包也看不到真实内容。

缺点是:太麻烦了。前后端都需要引入额外的加密库,性能开销也不小。而且一旦密钥泄露,整个系统就会变得不安全。所以除非你是在做银行级别的应用,否则真的没必要这么折腾。

这里注意,我踩过好几次坑的地方是:密钥管理是个大问题。如果密钥硬编码在前端代码里,那基本等于裸奔。正确的做法是把密钥放在后端,前端通过接口获取临时密钥,但这又增加了复杂性。

我的选型逻辑

综合来看,我一般会选择前端正则替换的方案,因为它够简单、够灵活,能满足大部分需求。如果项目对安全性要求特别高,我会倾向于让后端返回脱敏数据。至于加密解密方案,我只会在极少数情况下考虑。

当然,具体选型还是要看场景。比如在一个内部管理系统中,安全性可能不是首要考虑因素,前端正则就够了;但如果是一个面向公众的电商平台,涉及用户隐私的数据最好还是让后端处理。

以上是我的对比总结,有不同看法欢迎评论区交流

这篇文章主要讲了三种敏感信息隐藏的技术方案,从代码到踩坑经验都分享了一下。总的来说,每种方案都有自己的适用场景,没有绝对的好坏之分。希望我的经验能对你有所帮助,如果你有更好的实现方式,欢迎在评论区留言讨论。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论