开发者社区 > 云存储 > 对象存储OSS > 正文

oss客户端AES256加密上传文件怎么获得访问url

已解决

使用ossEncryptionClient.getObject(bucketName, objectName)获取到的文件内容是正确的 但是使用ossEncryptionClient.generatePresignedUrl(bucketName, objectName, expiration)获取的url访问图片不显示,文字内容是乱码,请问应该怎么正确获取加密上传文件的访问路径 image.png

image.png

展开
收起
游客dtddz6rwpgltq 2023-06-08 14:54:48 305 0
5 条回答
写回答
取消 提交回答
  • 采纳回答

    使用AES256加密上传文件到OSS时,如果要获取访问URL,您需要在获得访问URL之前对该文件进行解密,参考步骤

    1. 在上传文件时,使用AES256算法加密文件,并将其上传到OSS中。

    2. 通过OSS API或SDK,使用与加密时相同的密钥和算法对该文件进行解密。这将生成一个未加密的临时文件。

    3. 将未加密的临时文件保存到您的本地计算机或其他存储设备中。

    4. 使用OSS API或SDK,生成一个签名URL来授权用户访问未加密的临时文件。在生成签名URL时,可以设置URL的有效期限和访问权限等参数。例如,您可以为生成的URL设置只读权限,有效期为24小时。

    5. 将签名URL提供给用户,使其可以访问并下载未加密的临时文件。这个URL可以通过复制粘贴方法共享给其他人。

    需要注意的是,在使用签名URL时,不应将未加密的临时文件直接暴露给公众。否则,未经授权的用户可能会访问和下载文件

    2023-06-08 17:59:07
    赞同 1 展开评论 打赏
  • 要正确获取加密上传文件的访问路径,您需要在生成访问URL时指定正确的加密策略和算法。在您的代码中,您需要使用SSEKMSKeyManagementParameters指定KMS加密算法,并使用SSECustomerKey指定主密钥进行加密。以下是一个示例代码片段,演示如何生成正确的访问URL:

    java GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName)
    .withMethod(HttpMethod.GET)
    .withExpiration(expiration)
    .withSSEKeyManagementParameters(new SSEKMSKeyManagementParameters(keyEncryptionKeyId))
    .withSSEUsingCustomerProvidedEncryptionKey(true)
    .withSSECustomerKey(new SSECustomerKey(masterEncryptionKey));
    String presignedUrl = s3EncryptionClient.generatePresignedUrl(generatePresignedUrlRequest); 请确保您已正确设置KMS密钥和主密钥,并将密钥ID和主密钥传递给SSEKMSKeyManagementParameters和SSECustomerKey。

    如果您仍然遇到访问问题,请确保您的浏览器或应用程序支持AES256加密的URL访问。某些浏览器或应用程序可能不支持AES256加密的URL访问,因此您可能需要考虑使用其他加密算法或使用支持AES256的浏览器或应用程序。

    2023-06-09 08:42:18
    赞同 展开评论 打赏
  • 使用 AES256 加密方式上传到 OSS 的文件,在使用 generatePresignedUrl 生成访问URL时需要额外指定 response-content-encrypt 参数,同时还需要指定 Content-Type,例如:

    import oss2
    
    auth = oss2.Auth('<your-access-key-id>', '<your-access-key-secret>')
    bucket = oss2.Bucket(auth, '<your-bucket-endpoint>', '<your-bucket-name>')
    
    object_name = '<your-object-name>'
    object_content = 'Hello, OSS!'
    
    # 使用AES256加密方式上传文件
    oss_encryption_client = oss2.ext.AesEncryptionOssClient(auth, bucket)
    oss_encryption_client.put_object(object_name, object_content)
    
    # 生成访问URL
    url = oss_encryption_client.generate_presigned_url(
        'GET',
        object_name,
        expiration=3600,
        headers={
            'Content-Type': 'text/plain;charset=utf-8',
            'response-content-encrypt': 'AES256'
        }
    )
    print(url)
    

    在调用 generate_presigned_url 方法时,需要在 headers 中指定 Content-Typeresponse-content-encrypt 参数,其中 response-content-encrypt 参数指定了返回数据的加密方式,这样生成的访问 URL 才可以正确访问到加密上传的文件。

    另外,需要注意的是,访问加密上传的文件需要使用支持 AES256 加密方式的 OSS 客户端,否则也无法正常访问文件。

    2023-06-08 17:27:18
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    使用 OSSEncryptionClient 上传加密文件后,如果要通过预签名 URL 访问对象内容,需要使用相同的加密客户端进行签名。否则,会导致获取的 URL 无法正确解密访问,出现乱码或者无法显示的问题。

    以下是一份示例代码,可以参考一下:

    // 初始化 OSS 客户端
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // 初始化 OSS 加密客户端
    OSSEncryptionClient ossEncryptionClient = new OSSEncryptionClient(ossClient, new CryptoConfiguration(), null);
    
    // 上传加密文件
    PutObjectResult putResult = ossEncryptionClient.putObject(bucketName, objectName, new File(localFilePath));
    
    // 生成预签名 URL(使用相同的加密客户端进行签名)
    Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
    URL signedUrl = ossEncryptionClient.generatePresignedUrl(bucketName, objectName, expiration);
    
    // 输出预签名 URL
    System.out.println(signedUrl);
    

    在以上示例代码中,首先初始化了一个 OSSEncryptionClient 客户端,并使用该客户端进行文件上传和预签名 URL 的生成。这样就可以保证预签名 URL 和上传时使用的加密客户端一致,从而确保文件内容能够正确解密并访问。

    2023-06-08 15:44:53
    赞同 展开评论 打赏
  • 根据问题描述,使用ossEncryptionClient.generatePresignedUrl()生成的URL访问图片不显示,文字内容是乱码,这很可能是因为生成的URL没有包含正确的加密信息导致的。

    生成预签名URL时,需要确保使用加密客户端(ossEncryptionClient)来生成URL,并且在生成URL时指定相同的加密算法和密钥ID。具体来说,可以在调用generatePresignedUrl()时,通过setMethod()和setHeaders()方法指定HTTP方法和HTTP头部信息。

    下面是一个示例代码,用于生成包含加密信息的预签名URL:

    // 设置HTTP方法和HTTP头部信息
    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
    request.setHeaders(new ResponseHeaderOverrides().setContentEncoding("aes256-cts", "keyId"));
    
    // 生成预签名URL
    URL url = ossEncryptionClient.generatePresignedUrl(request);
    

    在上述代码中,setContentEncoding()方法用于指定加密算法和密钥ID,这里使用的是AES-256算法,密钥ID为keyId。

    如果仍然无法正确访问加密上传的文件,可以检查以下几个方面:

    1、确认使用的加密算法和密钥ID是否与上传时一致;

    2、确认生成预签名URL时是否使用了正确的加密客户端(ossEncryptionClient);

    3、确认生成预签名URL时是否指定了正确的HTTP方法和HTTP头部信息。

    如果以上检查都没有问题,可以尝试打印生成的预签名URL,检查URL是否包含加密信息。

    2023-06-08 15:12:31
    赞同 展开评论 打赏

相关产品

  • 对象存储
  • 热门讨论

    热门文章

    相关电子书

    更多
    OSS运维进阶实战手册 立即下载
    《OSS运维基础实战手册》 立即下载
    OSS运维基础实战手册 立即下载