Java 密码保护的图像文件

Java 密码保护的图像文件,java,amazon-web-services,amazon-s3,passwords,Java,Amazon Web Services,Amazon S3,Passwords,我想创建或更新具有密码保护的图像文件。场景是,我们的infra团队将向AWS S3上传一个图像文件。稍后,我们想用java的密码保护这个图像文件。密码将自动生成,不会向任何人透露。如果有人试图直接从AWS S3下载映像,则不应打开该映像。我在AWS S3中尝试了服务器端加密 CopyObjectRequest request = new CopyObjectRequest(bucket, key, bucket, key); ObjectMetadata objectMetadata = new

我想创建或更新具有密码保护的图像文件。场景是,我们的infra团队将向AWS S3上传一个图像文件。稍后,我们想用java的密码保护这个图像文件。密码将自动生成,不会向任何人透露。如果有人试图直接从AWS S3下载映像,则不应打开该映像。我在AWS S3中尝试了
服务器端加密

CopyObjectRequest request = new CopyObjectRequest(bucket, key, bucket, key);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setServerSideEncryption(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
request.setNewObjectMetadata(objectMetadata);
s3client.copyObject(request)

但我还是能打开它。还有其他方法吗。

服务器端加密只加密存储在磁盘上的数据。它不是一种保护数据访问的方法

相反,您的要求似乎是:

  • 在Amazon S3上存储一些数据(如图像),并保持其私密性
  • 有选择地允许用户在获得授权后下载
最合适的解决方案是使用一种新的方法

默认情况下,Amazon S3中的所有对象都是私有的。然后您可以添加权限,以便人们可以访问您的对象。这可以通过以下方式完成:

  • 对单个对象的访问控制列表权限
  • Bucket策略(基于路径、IP地址、引用方等授予广泛访问权限)
  • IAM用户和组(向具有AWS凭据的用户授予权限)
  • 预签名URL
可以使用授予对S3对象的访问权,作为“覆盖”访问控制的一种方式。通常私有对象可以通过URL访问,方法是附加到期时间和签名。这是一种不需要web服务器就可以提供私有内容的好方法

应用程序负责对用户进行适当的身份验证,以确定是否允许他们访问S3中的对象。如果他们被授予访问权限,那么您的应用程序应该生成一个预签名的URL,作为指向对象的经过身份验证的链接。URL仅在有限的持续时间内有效

最好让后端应用程序(可能在Amazon EC2或AWS Lambda上运行)执行身份验证,然后生成URL。然后,经过身份验证的用户可以使用预签名的URL在分配的时间段(例如5分钟)内下载对象

与使用密码相比,此方法有几个好处:

  • 正确地验证用户(通过您的代码),而不仅仅是信任任何知道密码的人
  • 它允许您记录访问,以便您知道谁正在访问对象
  • 您的后端应用程序可以生成一个HTML页面,其中包含许多预先签名的URL,您的用户只需单击链接即可访问对象,而无需为他们希望下载的每个对象提供密码