我有一个用PHP编写的网站,支持MySql数据库。
我想要整个数据库。基本上我想要的是,如果任何人获得数据库登录凭证,就不能读取数据。
我读过mysql ENCODE()和AES_ENCRYPT()函数。但是这种方式会导致PHP脚本中的大量更改,以及一些性能问题。
是否有加密整个数据库文件的技术或其他方法来实现这一点?
- 您能否详细描述您的威胁模型;特别是,攻击者可能是谁,他们可能拥有什么资源,数据对他们有多大价值,从哪里发起攻击(即物理或远程)?您能否详细说明所需的响应;特别是,"必须不能读取数据"是什么意思?如果有足够的时间和资源,攻击者将能够破坏您设计的任何安全系统-安全性是一个平衡威胁和响应的问题。就性能而言,没有什么是没有成本的。
- 在任何加密系统中,一个重要的考虑因素是密钥管理:如果攻击者访问解密密钥的次数很少,那么加密将是无用的。但是,要使您的应用程序工作,这些密钥必须存储在可以访问它们的地方。这是一个非常复杂的主题…最常见的情况是,当人们问"如何加密数据库"时,答案是"不用麻烦"。
- 你想达到什么目的?在这里阅读一篇有趣的文章i.amniels.com/…
- @爱格亚尔……我只担心远程攻击。我只是不想让他们理解数据。
- 等等,例如,我在服务器上受到攻击,如果我有权访问数据库,我可以通过shell执行,使用php代码目录列表和查看php文件。现在,我可以访问PHP代码了,所以从数据库中获取数据和返回并编码数据库系统的代码是没有问题的。但是你谈到远程攻击,但是如果远程攻击是通过ftp/ssh/telnet/进行的呢?抓起一些PHP文件,看看加密是如何工作的?(示例攻击者复制攻击者本地服务器上的所有文件)?
如果您正在寻找符合标准的方法,只需确保您的数据库使用的文件系统受到全磁盘加密的保护。
对于PostgreSQL,这通常可以通过关闭PostgreSQL,将/var/lib/postgresql复制到加密驱动器,然后重命名旧目录,并在重新启动数据库服务器备份之前在/var/lib/postgresql上安装新驱动器来实现。(确定迁移成功后,一定要将旧目录的内容输入到shred中。)
对于mysql/etc,您的里程数会有所不同,但也应该是可能的。
避免使用AES_ENCRYPT()和同等产品。ENCODE()也没有帮助,因为编码不是加密。
如果需要对单个记录进行加密,您可能会对我们的PHP和SQL中的可搜索加密策略感兴趣,但这可能有点超出了这个问题的范围。我们有一个名为ciphersweet的库,它在php+sql中实现了可搜索的加密。
对密码和校验和使用SHA512和bcrypt_encode()功能。
对于其他特定的数据,使用php文件中的salt,使用某种机制base64_encode($your_db_table_data) +"MY_SALT_FROM_WEB".和backwards,base64_decode($your_db_table_data) + MY_SALT_FROM_WEB进行编码。
你可以使用gzdeflate,它可以分解和压缩你的数据+使用salt使解密变得困难。例子:
这将产生与数据库中一样简单的结果:??O?KWH?KQpI?r\???*JZ?AR。
用于解码deflate的用法为:gzinflate(gzdeflate($your_data_from_db + YOUR_SALT_FROM_WEB));。
这是参考:http://php.net/manual/en/function.gzinflat.php
如果您希望对char和更小的数据base64_enocode/base64_decode+您的_salt_hidden_对web进行更复杂的解码,其中包含char()数据库中的数据和更小的文本。
这就是我将如何在数据库中加密数据以供varchar()使用的想法。对于文本数据,使用带压缩和盐组合的加密方式。
我目前还不知道其他的解决方案,或者使用aes技术签出加密mysql数据:http://thinkdiff.net/mysql/encrypt-mysql-data-using-aes-techniques/
它使用AES_ENCRYPT和AES_DECRYPT集成到MySQL中,但这仅限于varbinary(150)或varchar(100)。使用带加密方法的压缩可以代替使用集成的mysql AES函数。
希望能有所帮助。
- 正如我已经说过的……我不想加密特定列。我要加密整个数据库。
- 使用as mysql函数加密所有数据并设置为二进制。用于加密的mysql的所有函数仅适用于row data dev.mysql.com/doc/refman/5.5/en/encryption-functions.html。如果把重点放在加密MySQL中的所有数据库上,就应该避免使用MySQL。用于支持或避免使用mysql,stackoverflow.com/questions/8054503/…
- sqlite对所有数据进行透明加密。存储用于加密的特定敏感数据:sqlite-crypt.com/documentation.htm
- 编码和压缩不是加密的。