【问题标题】:Providing encrypted data, and the means to decrypt it, insecure?提供加密数据以及解密数据的方法不安全?
【发布时间】:2012-02-16 21:43:02
【问题描述】:

我正在为我拥有的系统开发一个插件,它允许我的客户网站从中提取数据以显示在他们的网站上。

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

我的计划是,用户将使用用户 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 和公钥,并且他从我的系统网站上的教程/用户手册中下载了解密类的副本,我说他不会这样做是对的吗?不需要知道私钥,因为他可以通过研究代码来解决如何解密它?

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

【问题讨论】:

  • 您使用 ssl 连接而不是自己加密数据怎么样?
  • @Erik 我可以使用 SSL,但我无法控制用户端,我怀疑他们会这样做。

标签: php public-key-encryption


【解决方案1】:

Malicious 先生不会仅仅通过研究代码就知道如何解密任何东西。他能做的最好的事情就是暴力破解“私钥”。

我把它放在引号中,因为这实际上不是公钥加密或密码术。如果您的服务器使用客户端的公钥加密数据,然后客户端使用他们的私钥解密,这将只是公钥加密。如果是这样的话,服务器根本不需要知道私钥。但听起来您将公钥用于完全不同的事情。

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

如果您使用强加密/解密方法,您的方法看起来不错,但我会使用现有算法,例如 Blowfish 或 AES。

【讨论】:

  • 啊,谢谢,有道理。我确实浏览了现有的方法,但可能看起来不够努力,我的印象是它们要么只是单向哈希。我真的不想在这里重新发明轮子,所以如果有一个好的内置解决方案,那就是我想要使用的!
【解决方案2】:

一个好的加密方法永远不会依赖于人们不知道它是如何工作的以确保其安全性。事实上,如果您要使用加密,您绝不想尝试自己制作。如果用于加密某些东西的方法很简单,例如ROT13,那么是的,知道该方法将使攻击者可以很容易地解密它。

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

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

否则,请使用非对称密钥加密。这使用您描述的方法起作用,其中可以使用任何人都可以知道的公钥加密某些东西,但只能由拥有私钥的人解密。最容易使用的版本是 GPG,可以在 PHP 中使用它,尽管可能需要做更多的设置工作。见this article

【讨论】:

  • 在我上面描述的情况下,用户和服务器都会知道相同的密钥(它可以在用户激活服务时生成并显示给他们),我只是使用不同的一个来识别用户到服务器,这样解密密钥就不需要在两者之间发送,并且有被泄露的风险。我理想的解决方案将是广泛可用的东西,所以我会看看你链接的内容 - 我将使用 PHP 并可以添加扩展,但用户可能会在没有该控制的情况下使用标准共享主机,也许有些甚至会使用其他语言进行连接。
  • ...但是当然,仍然需要某种密钥,以便它只能由预期的接收者解密。
猜你喜欢
  • 1970-01-01
  • 2015-06-27
  • 2011-08-14
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多