?? 個人主頁 極客小俊
??? 作者簡介:web開發(fā)者葫盼、設(shè)計師、技術(shù)分享博主
?? 希望大家多多支持一下, 我們一起進(jìn)步村斟!??
?? 如果文章對你有幫助的話贫导,歡迎評論 ??點贊???? 收藏 ??加關(guān)注
什么是數(shù)據(jù)脫敏?
很多人做過開發(fā),但不一定知道這個詞匯數(shù)據(jù)脫敏
那么數(shù)據(jù)脫敏
其實就是把重要的一些數(shù)據(jù)信息
進(jìn)行隱藏蟆盹,
在我們開發(fā)指定的脫敏規(guī)則
之下對敏感數(shù)據(jù)進(jìn)行處理孩灯、編輯、修改
的一種方式,防止這些重要數(shù)據(jù)
直接暴露在不安全的環(huán)境下, 這就叫數(shù)據(jù)脫敏
總的來說數(shù)據(jù)脫敏
的意思就是讓敏感的數(shù)據(jù)通過一種脫胎換骨的手法把它隱藏起來,簡單的說就是把敏感數(shù)據(jù)保護(hù)起來!
開發(fā)中哪些數(shù)據(jù)和應(yīng)用場景需要做數(shù)據(jù)脫敏
我們平常開發(fā)中其實有很多簡單的業(yè)務(wù)也會涉及到數(shù)據(jù)脫敏
這些信息就是比較敏感的信息逾滥,必然需要處理才行!
我們來看看以下的這些應(yīng)用場景!
例如:用戶個人信息
我們在處理用戶個人信息時峰档,例如姓名、地址、電話號
碼等讥巡,為了保護(hù)用戶的隱私掀亩,需要對這些數(shù)據(jù)進(jìn)行脫敏處理,如將電話號碼替換為部分號碼 或者把手機(jī)號碼的中間重要的四位數(shù)字進(jìn)行隱藏欢顷。
一些金融信息
例如銀行賬號槽棍、信用卡號
等,為了防止數(shù)據(jù)泄露
和欺詐行為
抬驴,需要對這些數(shù)據(jù)進(jìn)行脫敏處理炼七,如將賬號部分?jǐn)?shù)字替換為*
對吧!
另外就是一些醫(yī)療信息
,例如病歷布持、診斷結(jié)果豌拙、藥品處方
等,為了保護(hù)患者的隱私和安全鳖链,需要對這些數(shù)據(jù)進(jìn)行脫敏處理姆蘸,比如:患者姓名墩莫、診斷結(jié)果
等敏感信息進(jìn)行脫敏芙委。
企業(yè)敏感數(shù)據(jù)
也可能存在一些敏感數(shù)據(jù),比如: 公司財務(wù)報告狂秦、產(chǎn)品營銷策略文檔
等灌侣,為了防止數(shù)據(jù)泄露給未授權(quán)人員,需要對這些數(shù)據(jù)進(jìn)行脫敏處理裂问。
還有數(shù)據(jù)傳輸
也存在這個情況, 例如在數(shù)據(jù)庫或日志文件中存儲用戶密碼侧啼、在互聯(lián)網(wǎng)傳輸敏感信息時,為了保護(hù)數(shù)據(jù)的安全性堪簿,需要對這些數(shù)據(jù)進(jìn)行脫敏處理痊乾,如將密碼哈希存儲、對傳輸?shù)臄?shù)據(jù)進(jìn)行加密等椭更。
舉個簡單的栗子
大家都知道自己賬戶的銀行卡吧哪审, 加入你要查看銀行卡的時候,只會顯示銀行卡的最后4位
如圖
這就是數(shù)據(jù)脫敏
后的效果
假如你要查看銀行卡的全部卡號虑瀑,那么你就要通過本人來進(jìn)行人臉識別湿滓,手機(jī)短信驗證
,通過以后才能顯示全部銀行卡來進(jìn)行查看!
數(shù)據(jù)脫敏的簡單過程
簡單的說也就是把數(shù)據(jù)中敏感
的部分變成密文
的手法!
簡單的數(shù)據(jù)脫敏
流程大致如下:
首先你要確定哪些數(shù)據(jù)屬于敏感數(shù)據(jù)
, 然后根據(jù)實際情況選擇合適的脫敏方式,比如: 加密舌狗、替換叽奥、刪除
等都可以,用這些方式來對對敏感數(shù)
據(jù)進(jìn)行脫敏處理
從而確保數(shù)據(jù)的安全性
和可用性
如圖
然后再根據(jù)脫敏數(shù)據(jù)
的規(guī)范制定一系列訪問權(quán)限
的邏輯規(guī)則
舉個栗子
比如用戶身份驗證或者登錄之后,確定用戶在某個權(quán)限的情況下痛侍,對于敏感數(shù)據(jù)
那么就按照用戶權(quán)限來進(jìn)行劃分訪問和查看!
如圖
PHP實現(xiàn)數(shù)據(jù)脫敏的簡單方法
假設(shè)有一個用戶表
朝氓,其中包含用戶的姓名、電話號碼
和電子郵件
地址
數(shù)據(jù)如下
// 用戶表數(shù)據(jù)
$users = [
['name' => '張三', 'phone' => '13812345678', 'email' => 'zhangsan@example.com'],
['name' => '李四', 'phone' => '13987654321', 'email' => 'lisi@example.com'],
];
為了保護(hù)用戶的隱私,需要對電話號碼
和電子郵件地址
進(jìn)行脫敏處理!
那么我們可以針對這個業(yè)務(wù)邏輯封裝一個簡單函數(shù)
代碼如下
/**
* @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;
}
// 對用戶表進(jìn)行循環(huán)脫敏處理
foreach ($users as &$user) {
$user = desensitizeData($user);
}
unset($user);
// 輸出脫敏后的用戶表數(shù)據(jù)
print_r($users);
在這個案例當(dāng)中我們定義了一個desensitizeData函數(shù)
赵哲,它接受一個數(shù)組
作為參數(shù)來檢查數(shù)組
中是否存在需要脫敏的敏感數(shù)據(jù)字段,并將其替換為相同長度的*
字符!
然后嘹狞,我們遍歷用戶表中的每個用戶,對其中的敏感數(shù)據(jù)進(jìn)行脫敏處理誓竿,最后輸出脫敏后的用戶表數(shù)據(jù)磅网。
這樣,用戶的電話號碼
和電子郵件地址
就被成功地脫敏隱藏了筷屡。
結(jié)果如下
當(dāng)然你也可以根據(jù)具體需求來修改代碼邏輯從而脫敏數(shù)據(jù)
比如:我們現(xiàn)在需要把保留手機(jī)號碼
的前三位
和后四位
涧偷,那么我們的代碼其實只需要加一個簡單的函數(shù)就可以了
代碼如下
/**
* @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;
}
// 對用戶表進(jìn)行循環(huán)脫敏處理
foreach ($users as &$user) {
$user = desensitizeData($user);
}
unset($user);
// 輸出脫敏后的用戶表數(shù)據(jù)
print_r($users);
效果如下
為了更好的實現(xiàn)數(shù)據(jù)脫敏的需求,我們可以優(yōu)化一下我們的封裝函數(shù)
讓這個函數(shù)可以兼容 手機(jī)號毙死、銀行卡燎潮、身份證、中文字符串的脫敏操作,并且可以自由指定脫敏字符!
代碼如下
/**
* 描述: 手機(jī)號扼倘,銀行卡號确封,身份證等 中文字符串脫敏處理函數(shù)
* @param $string 需要脫敏值
* @param int $start 開始
* @param int $length 結(jié)束 隱藏敏感數(shù)據(jù)的個數(shù)
* @param string $re 脫敏替代符號
* @return bool|string
* 示例:
* _DataDesensitization('數(shù)據(jù)字符串', 開始位置, 脫敏個數(shù));
*
*/
function _DataDesensitization($string, $start = 0, $length = 0, $mark = '*'){
//如果傳遞的字符串?dāng)?shù)據(jù)為空
if (empty($string)) {
return false;
}
//定義個空數(shù)組
$container = array();
//獲取字符串的長度
$mb_strlen = mb_strlen($string);
//循環(huán), 把傳遞進(jìn)來的字符串變?yōu)閿?shù)組
while ($mb_strlen) {
$container[] = mb_substr($string, 0, 1, 'utf8'); //每次循環(huán)把字符串最前面的第一個放入數(shù)組
$string = mb_substr($string, 1, $mb_strlen, 'utf8'); //每次循環(huán)重新賦值字符串本身
$mb_strlen = mb_strlen($string); //每一次循環(huán) 重新計算字符串的長度,用于循環(huán)條件的遞減
}
//統(tǒng)計一下,轉(zhuǎn)載數(shù)組中的元素個數(shù)
$strlen = count($container);
//求開始下標(biāo) 例如: 6 - 3 = 3 求出從數(shù)組的哪一位開始進(jìn)行處理
$begin = $start >= 0 ? $start : ($strlen - abs($start));
//結(jié)束值 也就是數(shù)組中的最后一個值對應(yīng)的下標(biāo)
$end = $last = $strlen - 1; //5
//$length 也就是要處理敏感數(shù)據(jù)的個數(shù)
if ($length > 0) {
$end = $begin + $length - 1;
} elseif ($length < 0) {
$end = $end - abs($length); // 5 - 1 = 4
}
//用字符串,隱藏對應(yīng)的數(shù)據(jù)
for ($i = $begin; $i <= $end; $i++) {
$container[$i] = $mark;
}
//把不符合邏輯的條件過濾掉, 這幾個條件也就是限定我們傳遞的$start和$length參數(shù)是否合法
// 1.開始下標(biāo)大于等于結(jié)尾下標(biāo)
// 2.開始下標(biāo)大于等于數(shù)組中的最后一個元素所對應(yīng)的下標(biāo)值
// 3.結(jié)尾值大于了數(shù)組中的最后一個元素所對應(yīng)的下標(biāo)值
if ($begin >= $end || $begin >= $last || $end > $last) {
// echo '$begin='.$begin."\n";
// echo '$end='.$end."\n";
// echo '$last='.$last."\n";
return false;
}
//合并數(shù)組再菊,返回字符串結(jié)果
return implode('', $container);
}
然后我們來試試看數(shù)據(jù)脫敏
代碼如下
// 用戶表數(shù)據(jù)
$users = [
['name' => '張曉明', 'phone' => '13812345678', 'email' => 'zhangsan@example.com'],
['name' => '李大嘴', 'phone' => '13987654321', 'email' => 'lisi@example.com'],
];
// 對用戶表進(jìn)行循環(huán)脫敏處理
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);
// 輸出脫敏后的用戶表數(shù)據(jù)
print_r($users);
結(jié)果如下
小結(jié)
數(shù)據(jù)脫敏
是項目中很常見的一種數(shù)據(jù)保護(hù)方式爪喘,我們以后也會經(jīng)常用到這個小技巧!
關(guān)于數(shù)據(jù)脫敏
還有很多,不僅僅是這些纠拔,有時間在給大家深入分享數(shù)據(jù)脫敏的更多知識!
如果我的博客對你有幫助秉剑、如果你喜歡我的博客內(nèi)容,請 “??點贊” “??評論” “??收藏”
一鍵三連哦稠诲!
如果以上內(nèi)容有任何錯誤或者不準(zhǔn)確的地方侦鹏,????歡迎在下面 ?? 留個言指出、或者你有更好的想法臀叙,歡迎一起交流學(xué)習(xí)??????????