PHP函數(shù)封裝分分鐘幫你實(shí)現(xiàn)數(shù)據(jù)脫敏處理, 支持手機(jī)、郵箱、身份證號 中文字符串!

?? 個(gè)人主頁 極客小俊
??? 作者簡介:web開發(fā)者、設(shè)計(jì)師、技術(shù)分享博主
?? 希望大家多多支持一下, 我們一起進(jìn)步!??
?? 如果文章對你有幫助的話,歡迎評論 ??點(diǎn)贊???? 收藏 ??加關(guān)注

什么是數(shù)據(jù)脫敏?

很多人做過開發(fā),但不一定知道這個(gè)詞匯數(shù)據(jù)脫敏

那么數(shù)據(jù)脫敏其實(shí)就是把重要的一些數(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ā)中其實(shí)有很多簡單的業(yè)務(wù)也會涉及到數(shù)據(jù)脫敏這些信息就是比較敏感的信息,必然需要處理才行!

我們來看看以下的這些應(yīng)用場景!

例如:用戶個(gè)人信息 我們在處理用戶個(gè)人信息時(shí),例如姓名、地址、電話號碼等,為了保護(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ù),比如: 公司財(cái)務(wù)報(bào)告、產(chǎn)品營銷策略文檔等,為了防止數(shù)據(jù)泄露給未授權(quán)人員,需要對這些數(shù)據(jù)進(jìn)行脫敏處理。

還有數(shù)據(jù)傳輸也存在這個(gè)情況, 例如在數(shù)據(jù)庫或日志文件中存儲用戶密碼、在互聯(lián)網(wǎng)傳輸敏感信息時(shí),為了保護(hù)數(shù)據(jù)的安全性,需要對這些數(shù)據(jù)進(jìn)行脫敏處理,如將密碼哈希存儲、對傳輸?shù)臄?shù)據(jù)進(jìn)行加密等。

舉個(gè)簡單的栗子

大家都知道自己賬戶的銀行卡吧, 加入你要查看銀行卡的時(shí)候,只會顯示銀行卡的最后4位

如圖

這就是數(shù)據(jù)脫敏后的效果

假如你要查看銀行卡的全部卡號,那么你就要通過本人來進(jìn)行人臉識別,手機(jī)短信驗(yàn)證,通過以后才能顯示全部銀行卡來進(jìn)行查看!

數(shù)據(jù)脫敏的簡單過程

簡單的說也就是把數(shù)據(jù)中敏感的部分變成密文的手法!

簡單的數(shù)據(jù)脫敏流程大致如下:

首先你要確定哪些數(shù)據(jù)屬于敏感數(shù)據(jù), 然后根據(jù)實(shí)際情況選擇合適的脫敏方式,比如: 加密、替換、刪除等都可以,用這些方式來對對敏感數(shù)據(jù)進(jìn)行脫敏處理 從而確保數(shù)據(jù)的安全性可用性

如圖

然后再根據(jù)脫敏數(shù)據(jù)的規(guī)范制定一系列訪問權(quán)限的邏輯規(guī)則

舉個(gè)栗子

比如用戶身份驗(yàn)證或者登錄之后,確定用戶在某個(gè)權(quán)限的情況下,對于敏感數(shù)據(jù)那么就按照用戶權(quán)限來進(jìn)行劃分訪問和查看!

如圖

PHP實(shí)現(xiàn)數(shù)據(jù)脫敏的簡單方法

假設(shè)有一個(gè)用戶表,其中包含用戶的姓名、電話號碼電子郵件地址

數(shù)據(jù)如下

// 用戶表數(shù)據(jù)
$users = [
    ['name' => '張三', 'phone' => '13812345678', 'email' => 'zhangsan@example.com'],
    ['name' => '李四', 'phone' => '13987654321', 'email' => 'lisi@example.com'],
];

為了保護(hù)用戶的隱私,需要對電話號碼電子郵件地址進(jìn)行脫敏處理!

那么我們可以針對這個(gè)業(yè)務(wù)邏輯封裝一個(gè)簡單函數(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);

在這個(gè)案例當(dāng)中我們定義了一個(gè)desensitizeData函數(shù),它接受一個(gè)數(shù)組作為參數(shù)來檢查數(shù)組中是否存在需要脫敏的敏感數(shù)據(jù)字段,并將其替換為相同長度的*字符!

然后,我們遍歷用戶表中的每個(gè)用戶,對其中的敏感數(shù)據(jù)進(jìn)行脫敏處理,最后輸出脫敏后的用戶表數(shù)據(jù)。

這樣,用戶的電話號碼電子郵件地址就被成功地脫敏隱藏了。

結(jié)果如下

當(dāng)然你也可以根據(jù)具體需求來修改代碼邏輯從而脫敏數(shù)據(jù)

比如:我們現(xiàn)在需要把保留手機(jī)號碼前三位后四位,那么我們的代碼其實(shí)只需要加一個(gè)簡單的函數(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);

效果如下

為了更好的實(shí)現(xiàn)數(shù)據(jù)脫敏的需求,我們可以優(yōu)化一下我們的封裝函數(shù)

讓這個(gè)函數(shù)可以兼容 手機(jī)號、銀行卡、身份證、中文字符串的脫敏操作,并且可以自由指定脫敏字符!

代碼如下

/**
 * 描述: 手機(jī)號,銀行卡號,身份證等 中文字符串脫敏處理函數(shù)
 * @param $string 需要脫敏值
 * @param int $start 開始
 * @param int $length 結(jié)束 隱藏敏感數(shù)據(jù)的個(gè)數(shù)
 * @param string $re 脫敏替代符號
 * @return bool|string
 * 示例:
 * _DataDesensitization('數(shù)據(jù)字符串', 開始位置, 脫敏個(gè)數(shù));
 *
 */


function _DataDesensitization($string, $start = 0, $length = 0, $mark = '*'){
    //如果傳遞的字符串?dāng)?shù)據(jù)為空
    if (empty($string)) {
        return false;
    }

    //定義個(gè)空數(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)把字符串最前面的第一個(gè)放入數(shù)組
        $string = mb_substr($string, 1, $mb_strlen, 'utf8'); //每次循環(huán)重新賦值字符串本身
        $mb_strlen = mb_strlen($string); //每一次循環(huán) 重新計(jì)算字符串的長度,用于循環(huán)條件的遞減
    }

    //統(tǒng)計(jì)一下,轉(zhuǎn)載數(shù)組中的元素個(gè)數(shù)
    $strlen = count($container);
    //求開始下標(biāo) 例如: 6 - 3  =  3 求出從數(shù)組的哪一位開始進(jìn)行處理
    $begin = $start >= 0 ? $start : ($strlen - abs($start));
    //結(jié)束值 也就是數(shù)組中的最后一個(gè)值對應(yīng)的下標(biāo)
    $end = $last = $strlen - 1;  //5

    //$length 也就是要處理敏感數(shù)據(jù)的個(gè)數(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;
    }

    //把不符合邏輯的條件過濾掉, 這幾個(gè)條件也就是限定我們傳遞的$start和$length參數(shù)是否合法
    // 1.開始下標(biāo)大于等于結(jié)尾下標(biāo)
    // 2.開始下標(biāo)大于等于數(shù)組中的最后一個(gè)元素所對應(yīng)的下標(biāo)值
    // 3.結(jié)尾值大于了數(shù)組中的最后一個(gè)元素所對應(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ù)脫敏是項(xiàng)目中很常見的一種數(shù)據(jù)保護(hù)方式,我們以后也會經(jīng)常用到這個(gè)小技巧!

關(guān)于數(shù)據(jù)脫敏還有很多,不僅僅是這些,有時(shí)間在給大家深入分享數(shù)據(jù)脫敏的更多知識!

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

如果以上內(nèi)容有任何錯(cuò)誤或者不準(zhǔn)確的地方,????歡迎在下面 ?? 留個(gè)言指出、或者你有更好的想法,歡迎一起交流學(xué)習(xí)??????????

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 大數(shù)據(jù)平臺通過將所有數(shù)據(jù)整合起來,充分分析與挖掘數(shù)據(jù)的內(nèi)在價(jià)值,為業(yè)務(wù)部門提供數(shù)據(jù)平臺,數(shù)據(jù)產(chǎn)品與數(shù)據(jù)服務(wù)。大數(shù)據(jù)...
    大佛愛讀書閱讀 18,612評論 2 12
  • 一、定義 數(shù)據(jù)脫敏是指對某些敏感信息通過脫敏規(guī)則進(jìn)行數(shù)據(jù)的變形,實(shí)現(xiàn)敏感隱私數(shù)據(jù)的可靠保護(hù)。在涉及客戶安全數(shù)據(jù)或者...
    Separes閱讀 2,910評論 0 0
  • 背景與目標(biāo) 在數(shù)據(jù)倉庫建設(shè)過程中,數(shù)據(jù)安全扮演著重要角色,因?yàn)殡[私或敏感數(shù)據(jù)的泄露,會對數(shù)據(jù)主體(客戶,員工和公司...
    九尾喵的薛定諤閱讀 6,836評論 0 2
  • MOBILE.replace(/(\d{3})\d*(\d{4})/,'$1****$2') //手機(jī)號脫敏操作 ...
    韓girl閱讀 1,772評論 0 1
  • 拼多多有很多的活動都可以領(lǐng)現(xiàn)金,在那之前,記得先實(shí)名認(rèn)證一下,綁定好自己的微信賬號。不然是沒辦法提現(xiàn)的。那拼多多返...
    高省APP珊珊閱讀 3,151評論 0 0

友情鏈接更多精彩內(nèi)容