6

我的Delphi 2010应用程序(目前正在开发中)加密用户的文件并将它们上传到 EC2,然后再上传到 S3。用户可以使用安全网站下载他们的文件(有点像保管箱,但在不同的环境、市场、使用等中......)

我使用 RSA 加密。我让我的用户能够选择是使用自己的私钥(在本地生成)还是使用共享密钥(位于云端)

在处理文件下载时,我发现了 4 种必须正确处理的可能性:

  1. 如果用户使用他/她自己的私有加密密钥:

    一种。从 Delphi / Client 下载:下载后文件在用户机器上解密

    湾。从网站/PHP 下载:不可能(直接),除非我让用户可以下载一个小实用程序,该实用程序允许他/她在本地提供他/她的私钥并在下载后解密文件。

优点/缺点: 安全,但不直截了当/限制性太强,而且无法在手机上进行(?)

  1. 用户选择使用我的共享私有加密密钥(位于云端)

    一种。从 Delphi / 客户端下载:文件首先通过 EC2 上的 PHP 解密(然后提供给用户),在这种情况下,如果许多用户正在下载文件(不太可能)或被解密的文件太大,下载过程可能会变得非常慢.

    湾。从网站/PHP 下载:同 (a)

优点/缺点: 直截了当/只是工作,但可能会导致巨大的 CPU 使用率,下载时不可接受的延迟(尤其是如果有问题的文件大小很大)。

我的两部分问题是:

1)是否有更好的策略来处理这种情况?和

2)如果您想让您的用户能够在私有和共享加密密钥之间进行选择,您会怎么做(在加密策略/处理下载方面)?

PS。我正在使用 Delphi 2010(客户端)和在 EC2 实例上运行的 PHP 5.3 正在运行最新的标准 Amazon Linux 2012 构建

编辑流量总是加密的,所以只有 HTTPS!

编辑 2我正在使用 GPG 进行加密/解密

4

1 回答 1

2

如果您被迫提供服务器端加密/解密,请将 system()/exec() 与 openssl 或其他东西一起使用。我不想看到 PHP 用于加密/加密任何大的东西,仅仅是因为它并不是真正设计用来这样做的。在这种情况下,一段时间后删除未加密版本的文件很重要。

与您正在尝试做的事情一样,在服务器端确保安全确实很困难。如果您正在加密/解密小东西,您可能可以在浏览器中使用 javascript 执行此操作 - 也许请参阅https://www.google.com/search?q=javascript+aes&sugexp=chrome,mod=16&sourceid=chrome&ie=UTF -8

我会做什么:

1)上传到EC2。生成一个随机密码,用你的公钥加密,然后存储。您不想对大型数据使用非对称加密。使用先前生成的随机密码通过命令行使用 openssl 进行加密。将加密文件上传到 S3。删除(也许粉碎)未加密的文件。

2) 对于下载,从 S3 获取。让您的用户上传私钥。使用私钥解密先前随机密码的加密版本。现在使用该密码使用 openssl 解密文件。使名称成为随机的哈希值,这样它就可以在没有 PHP 的情况下直接通过 nginx/apache。让 cron 每 x 分钟清理一次。

于 2012-09-02T14:06:22.950 回答