我的 Delphi 2010 应用程序(目前正在开发中)加密用户的文件并将其上传到EC2然后再上传到S3。用户可以使用安全的网站下载他们的文件(有点像Dropbox,但在不同的环境,市场,使用等...)
我使用RSA加密。我让我的用户能够选择是否要使用自己的私钥(在本地生成)或使用共享密钥(位于云端)
在处理文件下载时,我最终得到了4种必须正确处理的可能性:
- 醇>
如果用户使用他/她自己的私人加密密钥:
一个。从Delphi / Client下载:文件在下载后在用户的机器上解密
湾从网站/ PHP下载:不可能(直接),除非我给用户下载一个小实用程序的可能性 允许他/她本地提供他/她的私钥并解密 下载后的文件。
优点/缺点:安全,但不是直截了当/限制太多,也不可能在手机上做(?)
- 相同 醇>
用户选择使用我的共享私有加密密钥(位于云端)
一个。从Delphi / Client下载:文件首先通过EC2上的PHP解密(然后提供给用户),在这种情况下下载 如果许多用户正在下载文件,则进程可能会变得很慢 (不太可能)或者如果被解密的文件太大。
湾从网站/ PHP下载:与(a)
优点/缺点:直接/正常工作,但可能导致巨大的CPU使用率,下载时出现无法接受的延迟(尤其是文件大小) 问题是巨大的。)
我的两部分问题是:
1)是否有更好的策略来处理这种情况?和
2)如果您希望为用户提供在私有和共享加密密钥之间进行选择的能力,您会做什么(根据加密策略/处理下载)?
PS。我正在使用Delphi 2010(客户端),在EC2实例上运行的PHP 5.3正在运行最新的标准Amazon Linux 2012构建
编辑流量始终加密,因此仅限HTTPS!
编辑2 我正在使用GPG进行加密/解密
答案 0 :(得分: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分钟清理一次。