【问题标题】:Encrypt Database加密数据库
【发布时间】:2013-03-25 07:42:54
【问题描述】:

我有一个用PHP 编写的网站,支持MySql 数据库。

我想Encrypt整个数据库。
基本上我想要的是如果有人获得数据库登录凭据,一定不能读取数据。

我已经阅读了 mysql ENCODE()AES_ENCRYPT() 函数。但是这种方式会导致 php 脚本的很多变化以及一些性能问题。

是否有任何技术可以加密整个数据库文件或任何其他方式来实现这一点?

【问题讨论】:

  • 您能否详细说明您的威胁模型;特别是,攻击者可能是谁,他们可能拥有什么资源,数据对他们有多大价值,他们可能从哪里发起攻击(即物理或远程)?您能否详细说明所需的响应;特别是,“不能读取数据”是什么意思?如果有足够的时间和资源,攻击者将能够破坏您设计的任何安全系统 - 安全是平衡威胁与您的响应的问题。就性能而言,没有什么是不付出代价的。
  • 任何加密系统中的一个重要考虑因素是密钥管理:如果攻击者访问解密密钥是微不足道的,那么加密将毫无用处。但是,为了让您的应用程序正常工作,这些密钥必须存储在可以访问它们的地方。这是一个非常复杂的主题……而且大多数情况下,当人们问“如何加密数据库”时,答案是“别打扰”。
  • 你想达到什么目的?在这里阅读一篇有趣的文章i.amniels.com/…
  • @eggyal.. 我只担心远程攻击。我只是不想让他们理解数据。
  • 等等,例如,我在服务器上受到攻击,如果我可以访问数据库,我可以使用 PHP 代码通过 shell 执行到目录列表并查看 PHP 文件。现在,我可以访问 PHP 代码,所以从数据库中获取数据和返回并编码数据库系统的代码没有问题。但是您谈到远程攻击,但是如果远程攻击是通过 FTP/SSH/Telnet/... 并抓取一些 PHP 文件并查看加密是如何工作的呢? (示例攻击者复制攻击者本地服务器上的所有文件)?

标签: php mysql security encryption


【解决方案1】:

如果您正在寻找标准合规性,只需确保您的数据库使用的文件系统受到全盘加密的保护。

对于 PostgreSQL,这通常可以通过关闭 PostgreSQL,将 /var/lib/postgresql 复制到加密驱动器,然后重命名旧目录并将新驱动器挂载到 /var/lib/postgresql 来实现,然后再次启动数据库服务器备份。 (确定迁移成功后,请务必shred 旧目录的内容。)

对于 MySQL/etc.,您的里程会有所不同,但也应该是可能的。

避免使用AES_ENCRYPT() 和等效项。 ENCODE() 也无济于事,因为 encoding is not encryption

如果您需要加密单个记录,您可能会对我们的 searchable encryption in PHP and SQL 策略感兴趣,但这可能有点超出了这个问题的范围。我们有一个名为 CipherSweet 的库,它在 PHP + SQL 中实现了可搜索的加密。

【讨论】:

    【解决方案2】:

    SHA512bcrypt_encode() 函数一起用于密码和校验和。

    对于其他特定数据,使用来自 PHP 文件的自己的 SALT + 使用某种机制进行编码 base64_encode($your_db_table_data) + "MY_SALT_FROM_WEB". 和向后,base64_decode($your_db_table_data) + MY_SALT_FROM_WEB

    您可以使用 gzdeflate 来解密并压缩您的数据 + 使用盐来使解密变得困难。示例:

    $data = gzdeflate($your_data) + YOUR_SALT;
    

    这将像在数据库中一样简单地生成:��O�KWH�KQpI�r\���*JZ<��AR

    解码 deflate 使用:gzinflate(gzdeflate($your_data_from_db + YOUR_SALT_FROM_WEB));

    这是参考:http://php.net/manual/en/function.gzinflate.php

    如果您想对 char 和较小的数据进行更复杂的解码,请使用 base64_enocode / base64_decode + YOUR_SALT_HIDDEN_FROM_WEB 数据库中的数据用于 CHAR() 和较小的文本。

    这是我的想法,我将如何加密数据库中的数据以供 VARCHAR() 使用。对于文本数据,使用加密方式与 SALT 组合进行压缩。

    我目前不知道其他解决方案,或者使用 AES 技术结帐加密 MySQL 数据:http://thinkdiff.net/mysql/encrypt-mysql-data-using-aes-techniques/

    这使用AES_ENCRYPTAES_DECRYPT 在 MySQL 中集成,但仅限于 VARBINARY(150) 或 VARCHAR(100)。使用 encrpyted 方法进行压缩可以做到这一点,而不是使用集成的 MySQL AES 函数。

    希望这会有所帮助。

    【讨论】:

    猜你喜欢
    • 2012-03-19
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多