当前位置: 首页 > 知识库问答 >
问题:

静止加密和/或AES_ENCRYPT

王才英
2023-03-14

我正在尝试提高一个MySQL数据库的安全性,它将包含敏感数据。我很难理解一些术语。谁能告诉我,我是否正确地理解了情况:

在Rest时加密-似乎我可以在表级别上启用此功能。表中的所有数据都使用密钥加密。如果有人掌握了备份文件或获得了对服务器的物理访问权限,那么数据就会受到保护。当然,这假定密钥存储在其他地方。

AES_ENCRYPT-在向表中插入/更新数据时,可以使用AES_ENCRYPT('data','password')。当通过SELECT查询数据时,我使用aes_decrypt

>

  • 假设我只是在Rest时使用加密,那么我需要在PHP代码中执行任何不同的操作来查询数据吗?我的PHP代码需要通过我的PDO请求将密钥发送到数据库吗?或者我可以使用我的普通代码查询数据库并且解密是自动处理的吗?

    或者我是否误解了rest加密的功能,因此我也需要使用aes_encrypt

  • 共有1个答案

    司徒翼
    2023-03-14

    静止加密是数据库中的数据未被使用/访问或更新时的加密。移动加密类似于TLS,其中数据(来自数据库)从服务器传输到服务器、浏览器、服务器、浏览器等。在大多数情况下,TLS是非常好的,如果您需要谨慎地处理它,并且以一种您需要做更多的事情来实际地使它安全的话。

    一个典型的例子是,人们在他们的域上戴上一个来自LetsEncrypt的TLS证书,并认为突然之间他们所有的东西都安全了;但是他们没有加密会话或cookie,所以在他们的防御中留下了一个巨大的潜在漏洞。

    这一点我再怎么强调也不为过;MySQL中内置的加密系统并不适合实际的安全数据保护。

    请阅读我在这里对一个非常相似的问题的回答,关于细节(我不想简单地复制/粘贴)。

    好吧,那么,因为你坚持...这里:

    我一直认为不要使用MySQL内置的加密功能,因为对静态数据(在SQL中)进行加密的要点是,如果服务器受到损害,数据就不会有[那么大]的风险。

    MySQL内置功能的问题是,它不适用于数据在“静止”状态之间的传递,因此任何数据的明文都可以在加密之前记录在MySQL日志中(以及存储系统的其他地方,例如查询查找没有加密,因此您可以从许多查找及其count结果中推断列值)。你可以在这里读到更多关于这个的内容。

    关于加密,您应该使用一些经过测试的库,如defuse/php-encryption。

    根据我在自己关于这个主题的研究中所读到的内容,Magnus提供的defuse/php-encryption的链接是防止MySQL破坏数据的最佳方法之一,它永远不会让MySQL程序/服务器看到数据的明文值。

    --回答如2017年5月7日发布的。

    Bill Karwin对同一问题的回答也给出了一些有价值的补充见解:

    +1,但我会为它的价值补充一些信息。

    MySQL5.7为InnoDB表空间实现了静态加密(https://dev.MySQL.com/doc/refman/5.7/en/InnoDB-tablespace-encryption.html)。

    据报道,MySQL8.0还将为InnoDB重做日志和撤消日志文件实现静态加密(https://dev.MySQL.com/doc/refman/8.0/en/innoDB-tablespace-encryption.html)。

    这仍然使查询日志和二进制日志未加密。我们将不得不等待MySQL的未来版本。

    为什么要花这么长时间?MySQL的安全工程负责人在上个月(2017年4月)Percona Live大会上的一次一针见血的会议上表示,他们正在非常小心地实施加密权。这意味着实现加密、密钥安全和密钥循环以及其他用法的功能。要把这个弄对是非常复杂的,而且他们不想实现一些会变得不推荐使用并使每个人的加密数据库无效的东西。

    --回答如2017年5月7日发布的。

    安全是复杂的。如果你想正确地做,并且对你的保护洋葱皮有信心,那么你需要做很多事情(见下面的子弹);但你首先要做的是:

    说真的。您需要采取不同的策略来对付那些想要窃取您的明文姓名和地址的人,以及那些想要接管您的服务器的人,还有那些仅仅因为这些原因而想要丢弃数据的人。这是一个神话,你可以保护所有人的所有时间,根据概念这是不可能的*;因此,您需要定义最可能的农业刺激因素,然后找出如何最好地减缓它们的进步。

    对于MySQL,一些明确的建议:

    >

  • 将SQL和PHP保留在同一台服务器上。不要远程访问MySQL数据。

    排除对SQL的外部访问(因此仅限localhost)

    混淆表名和列名;如果有人侵入了您的数据,并且您在username列下有hdtbj^BTUETHNUYT,那么他们就知道这个乱码可能是用户名,因此他们在尝试破坏您的加密时有了一个很好的开始。

    重要:真正锁定您的表访问;建立大量的MySQL用户,每个用户只需要最少的私人资源来做他们需要的事情;您希望用户(仅)读取表,并且仅读取某些表;用户可以写入某些表,但没有访问其他表的权限。这是一种关注点的分离,因此如果MySQL上的任何一个用户受到损害;您并没有自动丢失其中的每一条数据。

    使用PHP加密服务。将加密密钥存放在完全分开的地方;例如,另一个服务器仅用于备份,您可以访问该服务器仅用于获取加密密钥,因此,如果PHP/MySQL服务器受损,您有一些空间来切断并锁定密钥服务器,这样您就可以限制损坏。如果关键服务器也有备份,那么实际上您不会受到太大的损害(取决于情况)。

    设置大量的观察者和电子邮件告密者,以准确地告诉您某些进程何时在运行,以及哪些服务器用户(不是人,而是程序)在做什么。因此您可以看到为什么一个意外的进程在5am开始运行,以尝试测量MySQL表的大小。WTF?

    即使您的MySQL AES_Encrypt'ed数据不在数据库中,也有很大可能被“嗅探”,但是如果网站受到攻击(或者更糟的是,PHP代码不安全),那么定时攻击可以通过定时查询查找和数据包返回来计算数据内容。

    安全是一个黑洞;在某个时候,你会想“见鬼,我已经做得够多了”。没有人有完全的安全,一些非常专注的组织有足够的安全。在你走完这段路之前,你需要计算出你愿意走多远。

    *为什么不可能?因为要保护您的数据不受任何威胁,它必须是不可读的、不可用的,就像哈希一样。哈希在任何时候都不受任何人的攻击。但哈希永远不能被解哈希。

  •  类似资料:
    • 问题内容: 我正在尝试提高将包含敏感数据的MySQL数据库的安全性。我正在努力掌握一些术语。可以让我知道我是否正确理解了这种情况: 静态加密 -似乎我可以在表级别启用它。使用密钥对表中的所有数据进行加密。如果有人持有备份文件或对服务器具有物理访问权限,则数据将受到保护。当然,这假定密钥存储在其他位置。 AES_ENCRYPT- 在向表中插入/更新数据时,可以使用。通过SELECT查询数据时,我使用

    • 我们有带有加密数据的documentDB数据库。所有的加密和解密都在客户端处理。此数据库是在DocumentDB中不支持rest加密时创建的。我看到documentDB中新的rest加密支持符合HIPAA。在文档中提到,它是默认的,没有用户控制。如何在现有数据库中使用此功能?它会帮助我摆脱我的客户端加密吗?

    • 我有一个应用程序,需要在配置文件中存储一些秘密密码,如数据库和ftp密码/详细信息。我环顾四周,发现了许多使用AES的加密/解密解决方案,但我似乎不知道如何在不改变密钥的情况下使其工作。这意味着我可以加密和解密(使用相同的秘密密钥),但在重启等过程中保持持久性。我似乎无法让秘密钥匙保持不变。下面的示例显示了我的工作方法: 到目前为止还不错。然而,如果我运行它一次,我可能会得到'2Vhht/L80U

    • 问题内容: 我迅速编写了一个应用程序,我需要AES加密和解密功能,我从另一个.Net解决方案中接收了加密数据,但是我找不到解决办法。 这是我的.net加密: 我需要迅速解密功能。 问题答案: 我找到了解决方案,它是一个很好的库。 跨平台256位AES加密/解密。 此项目包含在所有平台(C#,iOS,Android)上均可使用的256位AES加密的实现。关键目标之一是通过简单的实现使AES在所有平台

    • 问题内容: 我想使用128位AES加密和16字节密钥对密码进行加密和解密。解密值时出现错误。解密时我丢失任何内容吗? 错误信息 最后我基于@QuantumMechanic答案使用以下解决方案 } 问题答案: 如果对于块密码,您将不使用包含填充方案的转换,则需要使明文中的字节数为该密码的块大小的整数倍。 因此,要么将纯文本填充到16字节的倍数(即AES块大小),要么在创建对象时指定填充方案。例如,您

    • 问题内容: 我想将加密的密码存储在Java文件中。我在使用 javax.crypto 的解决方案中看到了一个问题,但是问题在于密钥是动态生成的,并且是随机的。 然后将在运行时在Java程序中获取并解密该密码。鉴于我要在文件中存储一个已经加密的密码-解密时我想要正确的文本。 有没有办法告诉javax.crypto方法: 可以将其替换为基于某个私钥生成的我自己的密钥吗? 谁能指出一些有关执行此操作的资