?? 個人主頁 極客小俊
??? 作者簡介: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);
//求開始下標 例如: 6 - 3 = 3 求出從數組的哪一位開始進行處理
$begin = $start >= 0 ? $start : ($strlen - abs($start));
//結束值 也就是數組中的最后一個值對應的下標
$end = $last = $strlen - 1; //5
//$length 也就是要處理敏感數據的個數
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參數是否合法
// 1.開始下標大于等于結尾下標
// 2.開始下標大于等于數組中的最后一個元素所對應的下標值
// 3.結尾值大于了數組中的最后一個元素所對應的下標值
if ($begin >= $end || $begin >= $last || $end > $last) {
// echo '$begin='.$begin."\n";
// echo '$end='.$end."\n";
// echo '$last='.$last."\n";
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);
結果如下
小結
數據脫敏
是項目中很常見的一種數據保護方式,我們以后也會經常用到這個小技巧!
關于數據脫敏
還有很多,不僅僅是這些,有時間在給大家深入分享數據脫敏的更多知識!
如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “??點贊” “??評論” “??收藏”
一鍵三連哦!
如果以上內容有任何錯誤或者不準確的地方,????歡迎在下面 ?? 留個言指出、或者你有更好的想法,歡迎一起交流學習??????????