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);
    //求開始下標 例如: 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);

結果如下

小結

數據脫敏是項目中很常見的一種數據保護方式,我們以后也會經常用到這個小技巧!

關于數據脫敏還有很多,不僅僅是這些,有時間在給大家深入分享數據脫敏的更多知識!

如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “??點贊” “??評論” “??收藏” 一鍵三連哦!

如果以上內容有任何錯誤或者不準確的地方,????歡迎在下面 ?? 留個言指出、或者你有更好的想法,歡迎一起交流學習??????????

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容