我是一个PHP web开发人员,他一直在努力学习和理解如何用PHP钠加密和保护存储在数据库中的数据。
在安全知识方面,我对这个领域非常陌生,除了使用基本的password_hash / password_verify作为密码,并在处理数据时积极使用PDO,否则我对如何加密/解密消息、文件或其他敏感信息知之甚少。
如果一篇名为"StackExchange“的文章被加密,然后存储在数据库中。“TO+/ve+/vUTv73v.”
如何通过查看公共页面或使用授权用户帐户访问加密信息,搜索/加载加密信息并以plainText格式返回?
发布于 2019-12-11 23:51:35
如果您有加密的信息,则不能先对其进行解密才能搜索其中的信息。
如果用于搜索某物的信息不敏感,如用户ID、消息ID或其他仅与敏感信息有切线关联的信息,则使用该信息作为加密数据的索引。常用的选择是自动递增主键.
如果用于搜索基础的信息是敏感的,则应通过加密哈希函数实现索引。请记住,虽然散列冲突很少见,但不相关的明文将具有碰撞散列的事实是加密散列函数的一个重要特性。在找到候选行之后,需要验证它。
如果不对每一行进行解密,您肯定无法对加密数据执行任何全文搜索。明智地构造索引。
发布于 2020-01-02 23:50:10
一般来说,你想避免自己去实现任何一个。数据库加密已经是一个棘手的话题,而可搜索的数据库加密很难安全地设计。
例如,这样做很难的原因之一就是应用程序中通常会有很小的明文空间。借用的一个例子,假设你有一个医院里的病人数据库,其中包含了他们的HIV状况。这是一个高度敏感的信息,所以你自然要加密它。但你也需要能够通过该专栏进行搜索,这样才能执行只显示艾滋病毒阳性患者的查询。您可以这样做:以确定性的方式加密值,然后加密要搜索的值,并返回与该值匹配的行。问题是,对于这样的字段,明文空间非常小(只有真或假),攻击者可以通过猜测哪个加密值为真,哪个值为假,就可以发现每个患者的艾滋病毒状况,这是微不足道的,因为肯定的人比阴性的人少。
这仅仅是可搜索加密的问题之一,甚至在我们进入像索引和随机加密的性能这样的问题之前。
我强烈建议查看CipherSweet,它是在PHP中执行此类操作的最终库。链接到的博客文章详细介绍了您需要做什么才能启动和运行它,以及在数据库设计中需要考虑哪些安全问题。还有另一篇博文,它深入到库中的设计考虑中,以及加密是如何在幕后工作的。
https://security.stackexchange.com/questions/222628
复制相似问题