跳转到内容

密码学/数据库保护

来自维基教科书,开放世界中的开放书籍

数据库、邮件列表、成员列表的密码学保护。

数据库中有很多与密码学相关的技术

  • 匿名化/聚合/去个性化数据,这样人们就可以在不将特定项目与任何个人相关联的情况下获得数据的汇总统计信息
  • 列级加密,每列使用不同的加密密钥[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']       =       "[email protected]"; // 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 = "[email protected]";

        // 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. "将电子邮件地址仅存储为哈希值是否是个好主意?"
华夏公益教科书