Php 使用userid生成加密密钥

Php 使用userid生成加密密钥,php,mysql,encryption,Php,Mysql,Encryption,我想加密存储在教师访问的数据库中的一些个人数据(与学生相关的数据,例如他们的姓名、特殊需求状态、成绩等)。我以前曾以非常基本的方式使用过open\u ssl\u encrypt,但我的理解水平相当初级 我想我想做的是(如果这不好,请纠正我),为每个用户使用不同的加密密钥,这样他们就不能访问彼此的数据。我将通过某种方式将主密钥(只有我知道)与用户id相结合来生成此密钥 因此,加密密钥本身并不存储在数据库中,因此数据库黑客无法解密数据。黑客必须访问我的源代码才能获得主密钥,并且知道(以及如何)将主密

我想加密存储在教师访问的数据库中的一些个人数据(与学生相关的数据,例如他们的姓名、特殊需求状态、成绩等)。我以前曾以非常基本的方式使用过
open\u ssl\u encrypt
,但我的理解水平相当初级

我想我想做的是(如果这不好,请纠正我),为每个用户使用不同的加密密钥,这样他们就不能访问彼此的数据。我将通过某种方式将主密钥(只有我知道)与用户id相结合来生成此密钥

因此,加密密钥本身并不存储在数据库中,因此数据库黑客无法解密数据。黑客必须访问我的源代码才能获得主密钥,并且知道(以及如何)将主密钥与用户id结合起来

这是一个共同的解决方案吗?这明智吗?安全吗


谢谢。

如果您在代码中存储某种主密钥,您实际上没有保护任何内容,因为这实际上使服务器上的数据以纯文本形式可用。以下是我的做法

  • 为了与非对称加密一起使用,将为需要访问某些个人数据的每位工作人员生成单独的公钥和私钥。公钥存储在服务器上。他们需要将私钥保密
  • 将文档添加到服务器时,将生成新的对称密钥(例如AES),并使用该密钥对文档进行加密。每个文档都应该有自己的对称加密密钥。对于每个需要访问该文件的工作人员,对称密钥随后用其公钥加密。然后,公钥的加密版本与加密文档一起存储在服务器上,并丢弃纯文本文档和对称密钥
  • 当工作人员需要访问文件时,他们会提供自己的私钥。私钥解密对称密钥,对称密钥解密文件
  • 更新文件时,需要使用相同的对称密钥对其重新加密
  • []


    唯一需要注意的是,如果许多人需要访问单个文档,那么使用他们所有的公钥加密对称密钥可能需要一段时间。但是,您似乎指出,每个文档最多需要两个人访问,因此这应该不是什么大问题。

    如果您在代码中存储某种主密钥,您实际上没有保护任何内容,因为这实际上使服务器上的数据以纯文本形式可用。以下是我的做法

  • 为了与非对称加密一起使用,将为需要访问某些个人数据的每位工作人员生成单独的公钥和私钥。公钥存储在服务器上。他们需要将私钥保密
  • 将文档添加到服务器时,将生成新的对称密钥(例如AES),并使用该密钥对文档进行加密。每个文档都应该有自己的对称加密密钥。对于每个需要访问该文件的工作人员,对称密钥随后用其公钥加密。然后,公钥的加密版本与加密文档一起存储在服务器上,并丢弃纯文本文档和对称密钥
  • 当工作人员需要访问文件时,他们会提供自己的私钥。私钥解密对称密钥,对称密钥解密文件
  • 更新文件时,需要使用相同的对称密钥对其重新加密
  • []


    唯一需要注意的是,如果许多人需要访问单个文档,那么使用他们所有的公钥加密对称密钥可能需要一段时间。然而,您似乎指出每个文档最多需要两个人访问,因此这应该不是什么大问题。

    @Mike的回答将为用户不可见的内容增加太多的复杂性。我不希望用户为了查看数据而必须记住/存储密钥;数据被加密的事实应该与我的应用程序中的数据流无关

    我最终采用的解决方案是使用一个公共加密密钥,存储在服务器上,远离公共html。每个用户还拥有自己的加密密钥,存储在MySQL数据库中。这些密钥被异或以创建加密或解密其数据的密钥


    用户完全看不见它,这很好。要突破这一防御,黑客必须访问服务器和MySQL数据库,并正确组合密钥。我所保护的数据没有那么敏感(不是信用卡或任何有经济价值的东西)。

    @Mike的回答会给用户看不见的东西增加太多的复杂性。我不希望用户为了查看数据而必须记住/存储密钥;数据被加密的事实应该与我的应用程序中的数据流无关

    我最终采用的解决方案是使用一个公共加密密钥,存储在服务器上,远离公共html。每个用户还拥有自己的加密密钥,存储在MySQL数据库中。这些密钥被异或以创建加密或解密其数据的密钥


    用户完全看不见它,这很好。要突破这一防御,黑客必须访问服务器和MySQL数据库,并正确组合密钥。我所保护的数据没有那么敏感(不是信用卡或任何有经济价值的东西)。

    我想,如果我所有的数据库都遭到黑客攻击和泄露,我想我应该保护学生的隐私。在这种情况下,只需一个加密密钥即可。使用多个键的原因是为了防止一个用户能够看到其他用户的记录,但是由于MySQL选择过滤用户ID,这应该是不可能的