【PHP函数封装】分分钟帮你实现数据脱敏处理, 支持手机号码、邮箱、身份证号 中文字符串!

🚀 个人主页 极客小俊
✍🏻 作者简介:web开发者、设计师、技术分享博主
🐋 希望大家多多支持一下, 我们一起进步!😄
🏅 如果文章对你有帮助的话,欢迎评论 💬点赞👍🏻 收藏 📂加关注

什么是数据脱敏?

很多人做过开发,但不一定知道这个词汇数据脱敏

那么数据脱敏其实就是把重要的一些数据信息进行隐藏,

在我们开发指定的脱敏规则之下对敏感数据进行处理、编辑、修改的一种方式,防止这些重要数据直接暴露在不安全的环境下, 这就叫数据脱敏

总的来说数据脱敏的意思就是让敏感的数据通过一种脱胎换骨的手法把它隐藏起来,简单的说就是把敏感数据保护起来!

开发中哪些数据和应用场景需要做数据脱敏

我们平常开发中其实有很多简单的业务也会涉及到数据脱敏这些信息就是比较敏感的信息,必然需要处理才行!

我们来看看以下的这些应用场景!

例如:用户个人信息 我们在处理用户个人信息时,例如姓名、地址、电话号码等,为了保护用户的隐私,需要对这些数据进行脱敏处理,如将电话号码替换为部分号码 或者把手机号码的中间重要的四位数字进行隐藏。

一些金融信息 例如银行账号、信用卡号等,为了防止数据泄露欺诈行为,需要对这些数据进行脱敏处理,如将账号部分数字替换为*对吧!

另外就是一些医疗信息,例如病历、诊断结果、药品处方等,为了保护患者的隐私和安全,需要对这些数据进行脱敏处理,比如:患者姓名、诊断结果等敏感信息进行脱敏。

企业敏感数据也可能存在一些敏感数据,比如: 公司财务报告、产品营销策略文档等,为了防止数据泄露给未授权人员,需要对这些数据进行脱敏处理。

还有数据传输也存在这个情况, 例如在数据库或日志文件中存储用户密码、在互联网传输敏感信息时,为了保护数据的安全性,需要对这些数据进行脱敏处理,如将密码哈希存储、对传输的数据进行加密等。

举个简单的栗子

大家都知道自己账户的银行卡吧, 加入你要查看银行卡的时候,只会显示银行卡的最后4位

如图

这就是数据脱敏后的效果

假如你要查看银行卡的全部卡号,那么你就要通过本人来进行人脸识别,手机短信验证,通过以后才能显示全部银行卡来进行查看!

数据脱敏的简单过程

简单的说也就是把数据中敏感的部分变成密文的手法!

简单的数据脱敏流程大致如下:

首先你要确定哪些数据属于敏感数据, 然后根据实际情况选择合适的脱敏方式,比如: 加密、替换、删除等都可以,用这些方式来对对敏感数据进行脱敏处理 从而确保数据的安全性可用性

如图

然后再根据脱敏数据的规范制定一系列访问权限的逻辑规则

举个栗子

比如用户身份验证或者登录之后,确定用户在某个权限的情况下,对于敏感数据那么就按照用户权限来进行划分访问和查看!

如图

PHP实现数据脱敏的简单方法

假设有一个用户表,其中包含用户的姓名、电话号码电子邮件地址

数据如下

// 用户表数据
$users = [
    ['name' => '张三', 'phone' => '13812345678', 'email' => 'zhangsan@example.com'],
    ['name' => '李四', 'phone' => '13987654321', 'email' => 'lisi@example.com'],
];

为了保护用户的隐私,需要对电话号码电子邮件地址进行脱敏处理!

那么我们可以针对这个业务逻辑封装一个简单函数

代码如下

/**
 * @param $data
 * @return mixed
 */
function desensitizeData($data){
    $sensitiveData = ['phone', 'email'];
    foreach ($sensitiveData as $key) {
        if (isset($data[$key])) {
            $data[$key] = str_repeat('*', strlen($data[$key]));
        }
    }
    return $data;
}

// 对用户表进行循环脱敏处理
foreach ($users as &$user) {
    $user = desensitizeData($user);
}
unset($user);

// 输出脱敏后的用户表数据
print_r($users);

在这个案例当中我们定义了一个desensitizeData函数,它接受一个数组作为参数来检查数组中是否存在需要脱敏的敏感数据字段,并将其替换为相同长度的*字符!

然后,我们遍历用户表中的每个用户,对其中的敏感数据进行脱敏处理,最后输出脱敏后的用户表数据。

这样,用户的电话号码电子邮件地址就被成功地脱敏隐藏了。

结果如下

当然你也可以根据具体需求来修改代码逻辑从而脱敏数据

比如:我们现在需要把保留手机号码前三位后四位,那么我们的代码其实只需要加一个简单的函数就可以了

代码如下

/**
 * @param $phone
 * @return string
 */
function desensitizePhone($phone) {
    return substr($phone, 0, 3) . '****' . substr($phone, 7);
}

/**
 * @param $data
 * @return mixed
 */
function desensitizeData($data){
    $sensitiveData = ['phone', 'email'];
    foreach ($sensitiveData as $key) {
        if (isset($data[$key]) && $key=='phone') {
            $data[$key]=desensitizePhone($data[$key]);
        }else{
            $data[$key] = str_repeat('*', strlen($data[$key]));
        }
    }
    return $data;
}

// 对用户表进行循环脱敏处理
foreach ($users as &$user) {
    $user = desensitizeData($user);
}
unset($user);

// 输出脱敏后的用户表数据
print_r($users);

效果如下

为了更好的实现数据脱敏的需求,我们可以优化一下我们的封装函数

让这个函数可以兼容 手机号、银行卡、身份证、中文字符串的脱敏操作,并且可以自由指定脱敏字符!

代码如下

/**
 * 描述: 手机号,银行卡号,身份证等 中文字符串脱敏处理函数
 * @param $string 需要脱敏值
 * @param int $start 开始
 * @param int $length 结束 隐藏敏感数据的个数
 * @param string $re 脱敏替代符号
 * @return bool|string
 * 示例:
 * _DataDesensitization('数据字符串', 开始位置, 脱敏个数);
 *
 */


function _DataDesensitization($string, $start = 0, $length = 0, $mark = '*'){
    //如果传递的字符串数据为空
    if (empty($string)) {
        return false;
    }

    //定义个空数组
    $container = array();   

    //获取字符串的长度
    $mb_strlen = mb_strlen($string);

    //循环, 把传递进来的字符串变为数组
    while ($mb_strlen) {
        $container[] = mb_substr($string, 0, 1, 'utf8'); 
        $string = mb_substr($string, 1, $mb_strlen, 'utf8'); 
        $mb_strlen = mb_strlen($string); 
    }

    //统计一下,转载数组中的元素个数
    $strlen = count($container);
    $begin = $start >= 0 ? $start : ($strlen - abs($start));
    $end = $last = $strlen - 1;  //5

    if ($length > 0) {
        $end = $begin + $length - 1;
    } elseif ($length < 0) {
        $end = $end - abs($length); // 5 - 1 = 4
    }

    //用字符串,隐藏对应的数据
    for ($i = $begin; $i <= $end; $i++) {
        $container[$i] = $mark;
    }

    //把不符合逻辑的条件过滤掉, 这几个条件也就是限定我们传递的$start和$length参数是否合法
    if ($begin >= $end || $begin >= $last || $end > $last) {
        return false;
    }

    //合并数组,返回字符串结果
    return implode('', $container);

}

然后我们来试试看数据脱敏

代码如下

// 用户表数据
$users = [
    ['name' => '张晓明', 'phone' => '13812345678', 'email' => 'zhangsan@example.com'],
    ['name' => '李大嘴', 'phone' => '13987654321', 'email' => 'lisi@example.com'],
];


// 对用户表进行循环脱敏处理
foreach ($users as &$user) {
    //$user = dataDesensitization($user);
    foreach ($user as $key=>$value){
        if($key=='name'){
            $user[$key]=_DataDesensitization($value,1,2,'*');
        }else if($key=='phone'){
            $user[$key]=_DataDesensitization($value,3,4,'*');
        }
    }
}
unset($user);

// 输出脱敏后的用户表数据
print_r($users);

结果如下

小结

数据脱敏是项目中很常见的一种数据保护方式,我们以后也会经常用到这个小技巧!

关于数据脱敏还有很多,不仅仅是这些,有时间在给大家深入分享数据脱敏的更多知识!

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多 好玩 好用 好看的干货教程可以 点击下方关注❤️ 微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/129684.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章教会你写一个贪吃蛇小游戏(纯C语言)

一篇文章教会你写一个贪吃蛇小游戏 1、游戏展示2、游戏功能3、Win32 API3.1 控制台程序3.2 控制台屏幕上的坐标COORD3.3 GetStdHandle函数3.4 GetConsoleCursorInfo函数3.4.1 CONSOLE_CURSOR_INFO结构体 3.5 SetConsoleCursorInfo函数3.6 SetConsoleCursorPosition函数3.7 GetA…

C++智能指针的使用:shared_ptr、weak_ptr、unique_ptr的使用,使用案例说明。

系列文章目录 本章内容&#xff1a; &#xff08;1&#xff09;shared_ptr、weak_ptr、unique_ptr的介绍 &#xff08;2&#xff09;单独使用share_ptr造成的内存泄漏 &#xff08;3&#xff09;shared_ptr和weak_ptr的配合使用 文章目录 系列文章目录前言一、shared_ptr、wea…

openEuler 系统使用 Docker Compose 容器化部署 Redis Cluster 集群

openEuler 系统使用 Docker Compose 容器化部署 Redis Cluster 集群 Redis 的多种模式Redis-Alone 单机模式Redis 单机模式的优缺点 Redis 高可用集群模式Redis-Master/Slaver 主从模式Redis-Master/Slaver 哨兵模式哨兵模式监控的原理Redis 节点主客观下线标记Redis 节点主客观…

如何避免手动修改文件名,批量重命名文件的方法

在我们的日常生活和工作中&#xff0c;经常需要处理大量的文件&#xff0c;其中一些文件可能需要进行重命名。如果只是少数几个文件&#xff0c;我们可以手动重命名&#xff0c;但是当面对成百上千的文件时&#xff0c;手动重命名就变得非常繁琐和低效。那么&#xff0c;有没有…

低代码技术这么香,如何把它的开发特点发挥到极致?

前言 什么是低代码技术&#xff1f; 低代码是一种可视化软件开发方法&#xff0c;通过最少的编码更快地交付应用程序。图形用户界面和拖放功能使开发过程的各个方面自动化&#xff0c;消除了对传统计算机编程方法的依赖。 文章目录 前言低代码平台怎么选&#xff1f;用友Yonbu…

C语言中一维指针、二维指针和三维指针

指针可以指向一份普通类型的数据&#xff0c;例如 int、double、char 等&#xff0c;也可以指向一份指针类型的数据&#xff0c;例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针&#xff0c;我们就称它为二级指针&#xff0c;或者指向指针的指针。 假设…

github遇到想要强制拉取远程仓库内容

进行项目的时候&#xff0c;遇到了我的远程仓库 Sync fork 更新以后&#xff0c;这时候我的本地就和远程不同步&#xff0c;如果使用 git pull 的时候&#xff0c;如果出现 conficts 过多的情况怎么办&#xff0c;如果我们想要直接把远程仓库拉下来应该怎么办&#xff1f; git…

srs webrtc推拉流环境搭建

官方代码https://github.com/ossrs/srs 拉取代码&#xff1a; git clone https://github.com/ossrs/srs.gitcd ./configure make ./objs/srs -c conf/rtc.confconf/rtc.conf中&#xff0c;当推拉流浏览器在本地时&#xff0c;如果srs也在本地&#xff0c;那么可以使用官网默认…

​怎么测试websocket接口

在部分业务中&#xff0c;我们需要使用长连接&#xff0c;我们可以使用http长连接或者websocket&#xff0c;开发结束后难免会遇到测试问题&#xff0c;这里推荐2个&#xff0c;一个是postman&#xff0c;一个是网站 postman 测试网站 测这边推荐测试网站&#xff0c;支持ws/w…

Python开源项目CodeFormer——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…

如何记录血压的波动情况

import pandas as pd from plotnine import * import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Microsoft YaHei] 记录时间(time)、收缩压(SBP)、舒张压(DBP)&#xff1a; df pd.DataFrame({ time: [2023-11-01 08:30, 2023-11-02 21:00, 2023-11-0…

C++之旅(学习笔记)第6章 基本操作

C之旅&#xff08;学习笔记&#xff09;第6章 基本操作 6.1 基本操作 class X{ public:X(Sometype); // "普通的构造函数": 创建一个对象X(); // 默认构造函数X(const X&); // 拷贝构造函数X(X&&); // 移动构造函数X& operator(const …

规划文献阅读——Obstacle Avoidance, Path Planning and Control for Autonomous Vehicles

摘要 自动驾驶汽车避障需要三个主要层面&#xff0c;即感知、路径规划和制导控制。在本文中&#xff0c;考虑到这三个层次之间的联系&#xff0c;提出了一个全局架构。在环境感知层面&#xff0c;采用基于证据占用网格的方法进行动态障碍物检测。因此&#xff0c;考虑物体的姿…

鸿蒙原生应用开发-DevEco Studio远程模拟器的使用

使用单设备模拟器运行应用/服务 Remote Emulator支持Phone、Wearable、Tablet、TV等设备类型&#xff0c;但不同区域&#xff08;开发者帐号注册地&#xff09;支持的设备类型可能不同&#xff0c;请以实际可申请的设备类型为准。 Remote Emulator中的单设备模拟器&#xff08…

Sprint Boot 学习路线 3

嵌入式服务器 Spring Boot 的嵌入式服务器功能是一项方便而强大的功能&#xff0c;它允许你在应用程序中直接运行 Web 服务器&#xff0c;无需将其部署到单独的独立 Web 服务器中。这使得开发、测试和部署 Web 应用程序变得容易&#xff0c;而且它还是轻量级的、易于启动和停止…

linuxC语言缓冲区及小程序的实现

文章目录 1.文件缓冲区1.1介绍1.2缓冲文件系统1.3冲刷函数fflush1.4认识linux下的缓冲区 2.linux小程序的实现2.1 回车\r和换行\n2.2倒计时程序2.3进度条小程序sleep/usleep代码运行结果 1.文件缓冲区 1.1介绍 为缓和 CPU 与 I/O 设备之间速度不匹配&#xff0c;文件缓冲区用以…

【Maven教程】(十):使用 Hudson 进行持续集成—— 从Hudson的安装到任务创建 ~

Maven 使用 Hudson 进行持续集成 1️⃣ 持续集成的作用、过程和优势2️⃣ Hudson 简介与安装3️⃣ 准备 Subversion 仓库4️⃣ Hudson 的基本系统设置5️⃣ 创建 Hudson 任务5.1 Hudson 任务的基本配置5.2 Hudson 任务的源码仓库配置5.3 Hudson 任务的构建触发配置5.4 Hudson …

python之SPC:计算Cpk

目录 1、Ca、Cp和Cpk的理解 2、python计算Cp,Cpk与Pp,Ppk 3、总结 1、Ca、Cp和Cpk的理解 Ca、Cp和Cpk是制程能力指数&#xff0c;它们分别代表制程准确度、制程精密度和制程能力指数。 制程准确度&#xff08;Ca&#xff09;反映实际平均值与规格中心值之一致性。对于单边…

GF0-57CQD-002 测量参数:加速度、速度、位移–现场可配置

GF0-57CQD-002 测量参数:加速度、速度、位移–现场可配置 GF0-57CQD-002 是一款创新的双通道变送器&#xff0c;专为精确的振动测量而设计。它激励并读取来自加速度计的信号&#xff0c;并将整体振动值作为电流/电压信号传输。它测量加速度、速度和位移等不同参数的振动。配置…

竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…
最新文章