假设我有一个mysql数据库,用户可以通过php网站输入一些个人数据,比如邮政地址。用户无法登录此站点以稍后验证他们输入的内容。他们为之输入数据的企业(当然是自愿的)可以使用这些数据向用户发送实际的邮件(你知道的,邮政服务等)或电子邮件(当然用户事先同意他们要接收电子邮件)。数据库只是作为数据的存储,我希望它有点安全。如果有人闯入数据库,检索电子邮件地址和实际的名字和姓氏(许多电子邮件地址都包含这两个名字)可能不会造成太大的伤害,但知道人们住在哪里可能是一个太多的赠品。
企业通过一个c#前端访问数据库,该前端以数据库中的存储过程为目标执行任务,包括根据用户的电子邮件地址搜索用户。
根据我通过搜索收集到的信息,我可以想到以下步骤,以更安全的方式处理个人数据(而不是将其保存为数据库中的纯文本)
在将敏感信息提交到存储过程之前,纯文本在php中使用密钥进行加密,因此mysql服务器日志中看到的都是加密数据
前端使用相同的密钥,使数据在显示给企业用户时再次具有人性化的可读性(他们需要访问这些私有信息,并且用户对企业这样做感到满意,这就是这个方案的全部要点)
我的思路是:这些不是存储的密码,所以我不需要所有的密码散列骗术(据我所知,在数据库中安全地保存密码时,使用单向算法,因此,您永远不能直接从数据库对密码进行反向工程,而是必须将您要尝试的每个密码进行哈希运算,并根据所需的数据库条目进行测试,以查看您是否选择了正确的密码),而是可以进行简单的加密/解密,因为我不想强行将每个地址从数据库中删除。
有一些粗糙的边缘引起了我的担忧:
我需要以某种方式向php提供我想要加密的密钥。通常这是通过一个库或外部php文档完成的,就像您在一个单独的php文件中提供数据库连接信息,该文件位于服务器上的一个文件夹中,该文件夹无法从web访问(如果您尝试访问它,服务器会说访问被拒绝),这是一个好的做法,我能确定这个密钥文件是真正安全的吗?
我还需要提供前端的钥匙。这应该在前端的(可能是加密的?)配置文件中单独完成。把钥匙放在两个地方明智吗?尽管是两个不同的系统?决不能更改密钥,否则会丢失部分数据!
不知怎的,我有一种感觉,如果有人知道如何访问数据库,他/她可能知道连接数据在哪里,以及如何访问。哦,看,这是一个加密密钥,我想知道它能做什么。如果数据库访问被破坏,那么加密密钥公开的可能性有多大,使得所有为用户提供额外隐私的努力都无效?
如果我想再增加一点“额外的安全性”并加密电子邮件地址,我就必须加密我想从php或前端搜索的每个电子邮件地址,对吗?
有搜索程序使用´类´ 会破坏加密字段,不是吗?所以为了保留对电子邮件地址部分的搜索,我不能加密电子邮件条目,对吗?
我将不得不改变我的数据库字段二进制,以容纳加密的数据或使他们更大和base64编码他们,不是吗?
PHP7.0.7和c#中是否有加密/解密算法可供使用(我不太担心c#)一个相当安全的,同时又不会把我的小文本膨胀成大量二进制文件的程序?我不知道这是否有什么影响,但是如果我使用256位的密钥,那就是32字节。如果地址的街道部分短于32个字符,加密是否有效?会不会有笨重的填充物?
总而言之,与我在php文件和前端代码中必须采取的措施相比,我觉得安全性的提高是微乎其微的。感知到的安全增益可能更大(“哇!他们正在加密保存我们的数据!他们当然知道自己在做什么!)。对某些类型的用户具有严格的和限制性的特权(例如revoke)´选择´ 命令)总的来说应该更有帮助,不是吗?
为@luke joshua park编辑:
谢谢你详细的回答。我想你所说的api服务器是指我的php所在的Web服务器?这确实应该与数据库服务器分开。这两个服务器都托管在大学的网络中,但可以从internet访问。
我可以按照身份验证的路径,让企业内的每个用户(said university的小型项目,可能用词不当)都有一个数据库用户,并合理地设置了授权。但是使用php的外部用户只发送要存储在数据库中的数据(理想情况下是使用一个公共但独立的数据库用户,并相应地设置了授权),而从不检索(他们自己的)数据。使用身份验证意味着他们首先必须创建一个帐户(这是不需要的),他们如何为创建不需要的帐户进行身份验证?
1条答案
按热度按时间vktxenjb1#
在实现解决方案之前问这些问题是很好的,密码学很难正确理解,在开始之前需要有一个良好的理解。
我先快速回答你的问题,但更重要的是接下来的内容。
不是真的。见下文。
是的,在大多数情况下,只要可能,密钥应该保存在创建它们的设备上。
如果您的api服务器上没有数据库,则相对不太可能。
对。
对。
对。但不要把它们放在一边。浪费空间和处理能力没有任何好处。
你问错问题了。一个算法不是为一种语言而设计的。您只需要根据需要选择正确的算法/块模式/填充。
在大多数情况下,你问的问题都是无关紧要的。信不信由你,你的问题更多的是认证而不是加密。
您首先需要了解的是,服务器漏洞就是服务器漏洞。不管你用多少密码,坏事总会发生的。但我们可以尽可能减少损失。
您的数据库软件应该在api服务器上的一个单独的服务器/示例/任何东西上运行。加密/解密只能在api服务器上进行。这样做的好处是,为了解密数据(访问密钥),必须破坏api服务器和数据库服务器。如果密钥不在webroot或诸如此类的蠢事中,那么如何在api服务器上存储密钥就不那么重要了。
所有超过这个的都是身份验证。您需要一个强大的身份验证系统来确定谁可以向您发送信息,谁可以从您那里检索信息。与api服务器之间的通信显然应该始终用tls加密。您可以考虑使用tls客户机身份验证来确保向您请求数据的实体是他们所说的实体。通常情况下,客户端身份验证不能真正用于web,但是如果您以更私密的方式与“企业”进行交互,那么客户端身份验证是一个很好的选择。
总而言之:
将api服务器与数据库服务器分开。加密密钥应该只在api服务器上。有关从php到几乎任何其他语言的加密示例的集合,请参阅此存储库。
使用tls进行所有输入和输出通信。
关注身份验证。tls客户端身份验证是一个很好的选择。