我正在开发一个添加到我拥有的系统,它允许我的客户网站从中提取数据以显示在他们的网站上。
现在,大多数情况下,存储在系统中的信息都不是敏感的(因为它刚刚发布到他们的网站上),但是一些用户已经设置了他们想要在系统中管理的表格,方便,但不能在他们的网站上发布 - 尽管他们可能想要提出请求(即检查客户是否有登录他们的网站,或者获取电子邮件地址)。因此,我需要对响应进行加密,以减少某人获取不应该拥有数据的机会。
我的计划是用户将使用用户ID,公钥以及他们想要运行的查询的名称(他们将事先在系统中定义)来标识自己 - 并且请求将采用形成这样的东西:
require("backend-api.php");
$myUserID = "bobs-restaurant.com";
$myPublicKey = "sdg136MAGHYasfadgHGQ"; //send this with the request
$myPrivateKey = "adgljavd8i1356avdilj"; //never send this anywhere
$queryName = "LIST_OF_DISHES";
$backend = new backend-api();
$response = $backend->getData($myUserID,$myPublicKey,$queryName);
$list_of_dishes = $backend->decrypt($response,$myPrivateKey);
//user then goes on to use the data in their code or maybe just display it as-is.
它必须简单,因为用户要么不是经验丰富的PHP用户,要么他们会变得很穷,而且使用系统而不必编写自己的内容管理解决方案。
假设上面的用户ID和公钥是匹配的,并且查询存在并返回数据 - 我将让我的系统加密对用户已知的私钥的响应($ myPrivateKey),这是我的系统已知,但在请求中两者之间从未交换,因此无法拦截,我将使用类似this reversible encryption class的内容进行加密。
问题是,我将不得不向用户提供解密类,以便他们可以从响应中获取数据。
因此,如果Malicious先生以某种方式获得属于其他人的用户ID和公钥,并且他已经从我的系统网站上的教程/用户手册下载了解密类的副本,我是否正确地说他不会'我需要知道私钥,因为他可以通过研究代码来解决它的解密方法吗?
如果答案是肯定的,我没有想到的是什么会阻止这种情况发生?
答案 0 :(得分:1)
Malicious先生不知道如何通过简单地研究代码解密任何东西。他能做的最好的就是暴力破解“私钥”。
我把它放在引号中,因为这实际上不是公钥加密或加密。如果您的服务器使用客户端的公钥加密数据,那么这只是公钥加密,然后客户端使用其私钥解密。如果是这种情况,服务器根本不需要知道私钥。但听起来你正在使用公钥来完全不同。
您在这里谈论的是对称密钥加密(使用相同的密钥来加密和解密数据)。
如果您使用强大的加密/解密方法,您的方法似乎很好,但我会使用现有的算法,如Blowfish或AES。
答案 1 :(得分:1)
一种好的加密方法永远不会依赖于人们不知道它的安全性如何运作。事实上,如果您要使用加密,那么从不想要尝试制作自己的加密技术。如果用于加密某些东西的方法很简单,比如ROT13,那么是的,知道该方法将允许攻击者非常容易地解密它。
但是,像AES这样的加密方法在全世界广为人知,发布和使用。每个人都知道它是如何工作的,但是如果不知道用于加密和解密的密钥,就很难打破。
您遇到的最大问题是您链接的加密类和AES都是对称或预共享密钥加密方法。这意味着您必须使用相同的密钥来加密和解密数据。这不适用于您的目的,因为您和您的用户不知道相同的密钥。如果您有办法知道相同的密钥,请查看mcrypt for PHP
否则,使用非对称密钥加密。这可以使用您描述的方法,其中某些内容可以使用任何人都可以知道的公钥加密,但只能由具有私钥的人解密。要使用的最简单的版本是GPG,并且可以在PHP中使用它,尽管可能需要设置更多工作。见this article