提供加密数据以及解密数据的方法是不安全的


Providing encrypted data, and the means to decrypt it, insecure?

我正在开发一个系统的附加组件,该系统将允许我的客户网站从中提取数据并显示在他们的网站上。

现在,大多数时候,存储在系统中的信息在任何方面都不敏感(因为它刚刚发布到他们的网站上),但一些用户出于方便设置了他们想在系统中管理的表,但不在他们的网站上发布——尽管他们可能想在网站上提出请求(即,检查客户是否登录了他们的网站,或者获取电子邮件地址)。因此,我需要对响应进行加密,以减少有人获得不该拥有的数据的机会

我的计划是,用户将使用用户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),我的系统也知道该私钥,但在请求中从未在两者之间交换,因此不会被拦截,我打算使用类似于这个可逆加密类的东西来进行加密。

问题是,我必须为用户提供解密类,这样他们才能从响应中获取数据。

因此,如果Malicious先生以某种方式获得了属于他人的用户ID和公钥,并且他已经从我的系统网站上的教程/用户手册中下载了解密类的副本,我说他不需要知道私钥,因为他只需要通过研究代码就可以知道如何解密,这是对的吗?

如果答案是肯定的,我还没有想到会阻止这种情况发生的是什么?

Malicious先生不知道如何通过简单地研究代码来解密任何东西。他能做的最好的事情就是强行使用"私钥"。

我把它放在引号里是因为这实际上不是公钥加密或密码学。只有当服务器使用客户端的公钥加密数据,然后客户端使用其私钥解密数据时,这才是公钥加密。如果是这种情况,服务器将根本不需要知道私钥。但听起来你在用公钥做一些完全不同的事情。

您在这里谈论的似乎是对称密钥加密(使用相同的密钥加密和解密数据)。

如果你使用强加密/解密方法,你的方法似乎很好,但我会使用现有的算法,如Blowfish或AES。

一个好的加密方法从不依赖于人们不知道它是如何安全工作的。事实上,如果您要使用加密,就永远不想尝试创建自己的加密。如果用于加密某个东西的方法很简单,比如ROT13,那么是的,知道该方法会让攻击者很容易地解密它。

然而,像AES这样的加密方法在世界各地被广泛知晓、发布和使用。每个人都知道它是如何工作的,但如果不知道用于加密和解密的密钥,它就很难破解。

最大的问题是,您链接的加密类和AES都是对称预共享密钥加密方法。这意味着您必须使用相同的密钥来加密和解密数据。这不适用于您的目的,因为您和您的用户不知道同一个密钥。如果你有办法知道相同的密钥,请查看PHP 的mcrypt

否则,请使用非对称密钥加密。这可以使用您描述的方法来实现,在这种方法中,可以使用任何人都可以知道的公钥对某些内容进行加密,但只能由拥有私钥的人解密。最容易使用的版本是GPG,并且可以在PHP中使用它,尽管可能需要更多的设置工作。请参阅本文