跳轉到內容

密碼學/資料庫保護

來自華夏公益教科書

資料庫、郵件列表、成員列表的密碼學保護。

資料庫中有很多與密碼學相關的技術

  • 匿名化/聚合/去個性化資料,這樣人們就可以在不將特定專案與任何個人相關聯的情況下獲得資料的彙總統計資訊
  • 列級加密,每列使用不同的加密金鑰[1]
  • 格式保留加密
  • 資料比較
  • 透明資料加密
  • 等等。


Clipboard

待辦事項
詳細說明


資料庫通常透過全盤加密 進行保護,這在本書的另一章中進行了介紹。

影子密碼檔案可以被視為密碼雜湊摘要的“資料庫”。密碼處理將在本書的另一章中詳細討論,安全密碼

資料比較

[編輯 | 編輯原始碼]

我們通常希望告訴某人*不要*使用某些資料。但我們寧願不告訴人們具體細節。

例如,我們通常希望實現“密碼重置”,這樣如果有人忘記了他們在我們網站上的帳戶關聯的密碼,他們可以請求密碼重置,然後單擊發送到其電子郵件地址的“密碼重置”連結。我們只希望允許該人重置自己的密碼;我們當然不希望其他人(使用其他電子郵件地址)重置該帳戶的密碼。但有些人說 GDPR 反對我們將每個人的電子郵件地址儲存為純文字(以防伺服器備份檔案被盜)。一種提議的方法是儲存帶鹽和雜湊的電子郵件 (HEM),這樣當用戶點選“忘記密碼”按鈕時,使用者可以輸入一個電子郵件地址(系統永遠不會儲存到磁碟),系統會將其與儲存的 HEM 進行比較,只有當它們相同,系統才會將密碼重置連結傳送到該電子郵件地址。[2][3][4]

例如,我們希望人們知道他們的特定密碼是否已在公開資料洩露事件中洩露,但我們不希望惡意人員輕易收集這些密碼。[5]

例如,我們希望告訴電子郵件營銷人員不要向“禁止電子郵件”登錄檔中的任何人傳送任何電子郵件,但我們不希望讓垃圾郵件傳送者更容易向“禁止電子郵件”登錄檔中的每個人傳送垃圾郵件。一種提議的方法是避免直接儲存或以加密形式儲存此類電子郵件地址,而是對每個提交的電子郵件地址使用單向雜湊,並僅將輸出雜湊值儲存在資料庫中。[6][7]

已經為電子郵件地址提出了一系列資料遮蔽策略。[8]

Gravatar 使用雜湊的電子郵件地址。[9]

僅將電子郵件地址本身雜湊化每次都會生成相同的雜湊值。有些人建議在對電子郵件地址進行雜湊化之前新增“鹽”或“胡椒粉”,或者兩者都新增,這樣,一個數據庫中的雜湊地址就無法與其他資料庫中的雜湊地址匹配(使用不同的鹽或不同的胡椒粉,或者兩者都新增)。[10][11][12]

行級加密

[編輯 | 編輯原始碼]

一種簡單的保護方案:單向雜湊函式與對稱加密。

1. 對索引欄位的(明文)使用單向雜湊函式來建立一行加密金鑰。

2. 將步驟 1 中一行加密金鑰用作密碼金鑰來加密該行中的每個資料欄位。所有欄位都以加密形式儲存,即使是索引欄位也是如此。

對稱加密演算法——相同的密碼金鑰用於加密和解密資料

搜尋資料庫

[編輯 | 編輯原始碼]

在資料庫的索引欄位中查詢雜湊值,併為每個匹配的條目使用索引欄位作為密碼金鑰解密資料欄位。


PHP 程式碼示例

[編輯 | 編輯原始碼]

一些非常簡單的 PHP 虛擬碼,可以透過使用單向雜湊和 blowfish 對稱加密來保護您的資料,從而加密您的資料庫。

使用單向雜湊和 blowfish 對稱加密。1. 在加密資料庫中插入 John Doe 的記錄。2. 獲取使用者 John Doe 的加密記錄並解密資料。

在加密資料庫中插入 John Doe 的記錄。

[編輯 | 編輯原始碼]
<?php

        require_once("Crypt/Blowfish.php"); // a Pear class  http://pear.php.net

        $aRecord['email']       =       "johndoe@anisp.localhost"; // The Primary key
        $aRecord['name']        =       "John Doe";
        $aRecord['creditnr']    =       "0192733652342" ;

        // crypt - one-way encryption
        $cipher_key = crypt( $aRecord['email'] , "A_SECRET_COMPANY_SALT");

        $bf = new Crypt_Blowfish('ecb');
        $bf->setKey( $cipher_key );

        // crypt_blowfish symmetric encryption to encrypt the data
        $aRecord['email']       = $bf->encrypt( $aRecord['email'] );
        $aRecord['name']        = $bf->encrypt( $aRecord['name'] );
        $aRecord['creditnr']    = $bf->encrypt( $aRecord['creditnr'] );

        $result = sqlInsert( $aRecord ) ;
?>

獲取使用者 John Doe 的加密記錄並解密資料。

[編輯 | 編輯原始碼]
<?php

        require_once("Crypt/Blowfish.php");  // a Pear class http://pear.php.net

        $primary_key = "johndoe@anisp.localhost";

        // crypt - one-way encryption
        $cipher_key = crypt(  $primary_key , "A_SECRET_COMPANY_SALT");

        $bf = new Crypt_Blowfish('ecb');
        $bf->setKey( $cipher_key );

        // crypt_blowfish symmetric encryption to ecrypt the primary key for a sql select
        $select_key = $bf->encrypt(  $primary_key ) ;

        $aRecord = sqlSelectWithPKEY( $select_key );

        // crypt_blowfish symmetric encryption to decrypt the data
        $aRecord['email']       = $bf->decrypt( $aRecord['email'] );
        $aRecord['name']        = $bf->decrypt( $aRecord['name'] );
        $aRecord['creditnr']    = $bf->decrypt( $aRecord['creditnr'] );
?>

密碼學 這本書的頁面或章節是一個存根。您可以透過 擴充套件它 來幫助華夏公益教科書。

  1. "資料庫加密".
  2. "雜湊電子郵件地址和聯絡使用者".
  3. "為 GDPR 合規性雜湊電子郵件地址".
  4. "關於將電子郵件地址儲存為雜湊值的指南".
  5. "我被 Pwned 了嗎 (HIBP)".
  6. "2003 年反垃圾郵件法:國家禁止電子郵件註冊:聯邦貿易委員會提交給國會的報告". 第 20 頁
  7. "關於將電子郵件地址儲存為雜湊值的指南".
  8. "IBM InfoSphere Information Server:資料遮蔽策略".
  9. "Gravatar:建立雜湊".
  10. "電子郵件雜湊:可能出現的問題?".
  11. "是否值得將電子郵件地址儲存為雜湊值?".
  12. "將電子郵件地址僅儲存為雜湊值是否是個好主意?"
華夏公益教科書