我应该在哪里存储php的加密密钥?

我应该在哪里存储php的加密密钥?,php,security,encryption,administration,Php,Security,Encryption,Administration,我正在编写一个php应用程序,它接受敏感的客户数据,因此我需要在将其存储到mysql数据库之前对其进行加密。我将使用mysql的内置AES功能进行列级加密 我希望避免将加密密钥存储在服务器上,因此我将提供一个网页供管理员登录并输入加密密钥。我想在应用程序运行时将此密钥存储在内存中,但决不永久存储在磁盘上 最好的方法是什么 我是否可以修改$\u服务器阵列以在请求之间存储信息?我可以用某种方式在apache中存储密钥吗?可能是共享内存?存储任何类型的加密密钥最安全的地方是在服务器上,而不是数据库中,

我正在编写一个php应用程序,它接受敏感的客户数据,因此我需要在将其存储到mysql数据库之前对其进行加密。我将使用mysql的内置AES功能进行列级加密

我希望避免将加密密钥存储在服务器上,因此我将提供一个网页供管理员登录并输入加密密钥。我想在应用程序运行时将此密钥存储在内存中,但决不永久存储在磁盘上

最好的方法是什么


我是否可以修改$\u服务器阵列以在请求之间存储信息?我可以用某种方式在apache中存储密钥吗?可能是共享内存?

存储任何类型的加密密钥最安全的地方是在服务器上,而不是数据库中,并确保它归root所有,其他人不可读

与其依赖MySQL AES进行加密,不如使用PHP的原生openssl加密方案(PECL扩展)。这需要私钥和公钥,公钥用于加密,私钥用于解密,密钥可以保存在不同的位置。

一种可能性是创建一个RAM磁盘并将密钥存储在那里

我最终将加密密钥存储在内存表中。对数据库的所有访问都是通过一组存储过程完成的;存储过程包括进行密钥管理(即将密钥插入内存表、更改密钥、检查是否输入了密钥等)以及存储/检索应用程序数据的能力

在这种设计中,留在应用服务器上的数据库凭据只有通过一组定义的过程进行查询的权限,并且无法直接读取加密密钥

我喜欢这种方法,因为:

  • 密钥不存储在文件系统中,以防止在使用寿命结束时出现硬件处理问题,并防止系统管理员窥视
  • 应用程序代码无法访问密钥(除了在输入密钥时),因此它将驻留的唯一位置是在数据库进程中
  • 所有用于加密/解密的逻辑都嵌入在SQL查询中,因此不必担心应用程序代码是否正确执行了加密/解密操作,这对于维护来说很好

  • 虽然我认为你的想法本身很糟糕,但是如果机器自动重启(或者你需要重启),会发生什么呢。钥匙不见了吗?或者应用程序处于脱机状态,直到管理员可以从某个备份位置查找密钥并手动输入。这可能是一个缓慢的过程。如果管理员意外上传了错误的密钥或损坏的密钥,会发生什么情况?除非有人注意到,否则您存储的数据将永远无法检索,并且您不知道哪些数据是用坏密钥生成的,哪些是好密钥生成的,除非您尝试解密每个数据段并找出哪些数据是不可恢复的。@genesis:我同意攻击者仍然可以查看内存内容,但我需要与客户的IT部门合作,他们不希望将其存储在文件中。是的,据我所知,这有一大堆不良副作用。客户将如何访问?顺便说一句,数据库也在服务器上;)客户端不需要访问它。作者认为在每次应用程序启动时由管理员重新上传密钥是一个好主意,但这种想法并不可取。首先,如果管理员不小心弄错了密钥或一次上载了错误的文件,那么存储在其中的所有数据都将无法检索,也没有人知道哪些记录是用哪个密钥加密的。@serialworm您建议确保只有root用户可以读取该文件,但php可能不会以root用户身份运行……这一点很好。我确实注意到,他提到他希望避免将密钥存储在服务器上,但我知道在数据库中存储密钥的危险。AES加密的全部目的是在数据库受损时使数据无法读取。我通常会在配置文件或头文件中看到直接存储在PHP中的键和盐。这背后的基本原理是,如果有人正在查看您的PHP,那么无论您如何存储它,您都已经丢失了它,因为他们只需要找到您为实现解密而编写的函数调用。如果他们在途中发现了你的钥匙,那只是不可避免的损坏。如果服务器崩溃,你该怎么办?带键的内存中表将丢失,您的数据将无法再访问?