1. 程式人生 > >資料庫的優化-敏感資訊的查詢

資料庫的優化-敏感資訊的查詢

  • 不論一個網站還是一個APP,優化很大的地方還是資料庫,要想加快資料庫查詢的速度,有很多種方式。

  • 新增索引
    索引是一種單獨的、物理的數對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。但是索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。使用語法如下:

ALTER
TABLE <表名> ADD INDEX (<欄位>);
  • 使用where等條件語句
    一個表要是資料量足夠大的情況下,全表掃描必定降低查詢速度,應考慮在 where 及 order by 涉及的列上建立索引

  • 敏感資訊的查詢

    在進行敏感資訊查詢之前,我們先介紹下加密的方式及型別,現在的加密方式分位兩種,一種是可逆的,一種的不可逆的,如Rsa 和 Des就是可逆的,而MD5和Sha256等等就是不可逆的,可逆和不可逆的區別就是加密完成後還能不能解出來,雖然現在Md5很多md5線上解密之類的,但是那些都是暴力破解,他們的資料庫有很龐大的資料,但是要是md5稍微做些操作,如加鹽md5和加鹽hash等等,他們的破解就沒這麼容易了。

    回到主題:不可逆的加密一般都應用於密碼上,而那些查詢會相對比較簡單,如我們查詢一個使用者登入密碼是否正確,首先是根據使用者名稱查詢對應的記錄,然後對使用者上傳的密碼進行對比,此處是加鹽md5。

`md5(md5(password) + salt)  == mysql_password`

這樣就能輕易的做出查詢了,速度也在0.01s之內就能完成!

而可逆的加密演算法是應用於那些加密之後,自己還能夠解出來的,如銀行卡,身份證等等敏感資訊,這些資訊儲存資料庫,我們一般會採用Rsa來加密,那這時候我們要對這些銀行卡,身份證資訊作查詢得怎麼辦呢?因為mysql中沒有內建的rsa加密函式,如何是好呢?
我們可對這些資料再加一個欄位,做加鹽hash或者是加鹽md5


對應的查詢語句就會變成如下(此處列舉加鹽hash),加鹽hash的演算法是

 hash('sha256',hash('sha256','加密字串').'salt')

此處的salt是一段隨機字串

 $bank = hash('sha256', "6221558812340000");//hash sha256加密
 //資料庫查詢
 SELECT * FROM 表名 WHERE BANK_SHA256 = SHA2(CONCAT('$bank' , 'salt'));

其中的BANK_SHA256代表的就是資料庫種加鹽hash過後的欄位,’salt’代表的就是加鹽hash的那個鹽,存在列表種的一個隨機字串,而CONCAT是mysql資料庫中連結兩個字串的內建函式。

這種查詢雖然能一句就查詢出來,但是帶來的問題也是很大,首先我們看資料庫語句就知道,資料庫在做查詢的時候要對每一條資料進行CONCAT,對hash後的字串和對應列表中的salt做拼串,然後再做一層hash,一條資料要做這樣的操作,那假如是一千條,一萬條,一百萬條資料呢,這速度可能我們都以為資料庫卡死了,那這時候我們又該如何是好? 這次的敏感資訊我們先已銀行卡來做分析!

首先我們來10條資料(資料純模擬):

建行:6221 5588 1234 0000 建行 :6221 5588 1234 0001
建行:6221 5588 1234 0002 招行:6223 5864 4561 2321
招行:6223 5864 4561 2334 招行:6223 5864 4561 2325
中信:6220 1589 7412 2001 中信:6220 1589 7412 2202
中信:6220 1589 7412 2303 中信:6220 1589 7412 2404

看到這些資料的時候,有沒有什麼想法,有咩有什麼特點?

直觀的我們都會看到他們分為了一組一組,建行和招行和中信,那我們做查詢的時候是不是也可以先對他們進行分組,然後做查詢呢,假如我是100萬條資料,我裡面有50家銀行,那我先分組再查詢,是不是速度會比之前快將近50倍?或者是更多?那如何做分組呢,那我們就得找出他們的特點,然後對他們進行分組!

聰明的小夥伴都知道,每家髮卡行的開頭都是不一樣的,如上面資料建行是以6221 5588,而招行是以6223 5864開頭,而中信是以6220 1589開頭,特點被我們找到了,那我們如何利用呢,很簡單!我們就把這些特點給存起來,當成是一個分組標識。

類似我們要存- -建行:6221 5588 1234 0000 時,我們取出其前八位 6221 5588做hash加密,存到資料庫中的一個欄位中,像招行:6223 5864 4561 2321,我們取6223 5864做hash加密存到資料庫中,依次類推,這樣就把我們的10條資料分了三組。
有人說,這不是敏感資訊嗎,別擔心,我們可沒洩露這些敏感資訊,我們只是取了其中一部分,這部分就算洩露了也無傷大雅。

那我們查詢的時候就怎麼利用這個分組標識來做查詢呢?很簡單,如下:

 $bank = hash('sha256', "6221558812340000");//hash sha256加密
 $bankSpec = hash('sha256', "62215588"); //分組標識
 //做資料庫查詢
 SELECT * FROM 表名 WHERE BANK_SHA256 = SHA2(CONCAT('$bank' , 'salt')) AND bank_spec = bankSpec;

此處的bank_spec代表的是存入資料中的分組標識!
按照如上方法所示,果不其然,速度提升了非常多,幾乎是有幾十倍的上漲!

以上簡單講速了一種敏感資訊的查詢方式,其他型別的敏感資訊類似,這裡只是提供一種思路,希望能給大家帶來幫助!有什麼不對的地方,歡迎大家指正!