Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 金融数据的适当加密_Php_Mysql_Security_Encryption - Fatal编程技术网

Php 金融数据的适当加密

Php 金融数据的适当加密,php,mysql,security,encryption,Php,Mysql,Security,Encryption,我目前正在构建一个web应用程序(PHP/MySQL),它可以保存来自个人的数据。这些数据中的大部分不值得加密保护,但其中一些是收入等财务信息。它不是一个支付应用程序,也不存储像信用卡信息那样可以直接转化为金钱的信息,但仍然是你不想在可能的泄露中拥有的东西。该平台必须出售给想要“安全”的客户,但这可能意味着任何事情,因为客户本身并不知道他们真正想要什么,因为他们是商业人士,而不是密码专家(我也不喜欢) 它是一个管理平台,因此保存财务数据的人不是该平台的用户。该平台的用户仅仅是一个具有附加权限的登

我目前正在构建一个web应用程序(PHP/MySQL),它可以保存来自个人的数据。这些数据中的大部分不值得加密保护,但其中一些是收入等财务信息。它不是一个支付应用程序,也不存储像信用卡信息那样可以直接转化为金钱的信息,但仍然是你不想在可能的泄露中拥有的东西。该平台必须出售给想要“安全”的客户,但这可能意味着任何事情,因为客户本身并不知道他们真正想要什么,因为他们是商业人士,而不是密码专家(我也不喜欢)

它是一个管理平台,因此保存财务数据的人不是该平台的用户。该平台的用户仅仅是一个具有附加权限的登录名。服务器本身不必访问数据。每个操作都由登录的用户(也可以是管理员)完成。如果多个用户具有足够的权限,则他们需要访问相同的数据

我现在的问题是如何保护财务数据免受这些威胁:

  • 有人发现SQL注入并远程转储所有表
  • 有人偷了服务器的硬盘(数据库+代码)
我肯定不会去的地方:大规模嗅探攻击或受损服务器(比如嗅探服务器上SSL不重要的所有流量)或社会工程/网络钓鱼

我还想快速总结一下与当前系统相比,我需要存储多少信息(密钥、数据等),其中有一个简单的收入字段等,以及一个带有用户名和哈希密码的标准登录系统


编辑:重新制定的问题几乎完全遵循注释/答案的建议

非对称加密和混合加密在这里毫无意义,除非用户自己生成并保留私钥的所有权。我从你剩下的问题推断情况并非如此

假设您希望能够在无需用户交互的情况下查看此加密信息(例如,您不仅为用户存储此信息,而且该信息与您的业务运营相关),则您的存储选项有限

如果您的确切威胁模型是在发生数据库泄漏时保护此数据,而不是其他任何情况,那么对称加密是完美的,如果正确实施的话

这意味着对称密钥必须存储在向数据库发出请求并向其他(可能是前端)系统提供数据的服务器上。如果这些服务器中的任何一台遭到破坏,那么加密的数据就会泄露

总之,使用对称加密,但要明白它只会直接保护您免受通过SQL注入或类似攻击等方式造成的数据库泄漏。受损服务器是受损服务器,通常意味着在足够的时间内完全访问数据


编辑:如果您打算要求用户交互以查看受保护的数据,那么apokryfos上面的评论将准确地详细说明如何保护信息。从用户密码生成对称密钥,并使用此密钥加密其他对称密钥。使用此次对称密钥对数据进行实际加密。使用两个键可以更轻松地更改用户密码。

以下是两种方法:

1) 使用对称加密,因为您已经向客户端安排了一个秘密,即他们的密码

每当用户需要访问其敏感信息时,他们都需要提供密码。如果需要,则可以使用该密码作为生成加密密钥的基础

您可以使用PHP中的函数对敏感数据进行加密,并在客户端需要时对其进行解密。这将允许您选择OpenSSL支持的适当的难以破解的算法。这样做的缺点是,您将需要显式的用户权限和他们的密码来访问该数据,如果您仅代表该用户存储该数据,这是好的,但如果您需要将其传递给其他人,则这是坏的

这样,您就不需要在数据库中存储额外的信息。万一有人偷了你的硬盘,他们只会得到加密的敏感数据和散列密码。缺点是这是一个单点失败,如果他们破坏了加密,他们也会得到密码,反之亦然。然而,破坏加密的难度并不像反转散列那样高。它还依赖于强大的密码,正如我们所知,用户通常不会使用这些密码,但这不是一个新问题,我们今天也不太可能解决这个问题

2) 要求用户生成私钥对并向您发送公钥。然后可以存储此公钥并使用它加密数据。如果您有一个与服务器通信的应用程序/软件,它可以代表用户进行通信,但在web应用程序中很难实现,那么这通常会很好地工作。也许有JavaScript库可以做到这一点,但由于这不是通常做的事情,您需要100%确保您使用的库是安全的。然而,这也要求用户将密钥存储在某个地方,并在需要访问该数据时能够使用它(同样,JavaScript可以为用户执行此操作,但出于安全考虑,保存和加载密钥需要用户交互)

简言之:

  • 只有当加密密钥不存储在服务器上,而是用户可以在需要时提供时,对称加密才是安全的
  • 非对称加密甚至更安全,但在面向普通用户的web应用程序中是不现实的 因此,我建议使用用户密码作为密码进行对称加密