【发布时间】:2022-01-25 04:20:29
【问题描述】:
我正在尝试使用自定义密钥在亚马逊中实现加密,我根据文档提及在标题中提供这 3 个值
objectMetadata.setHeader("x-amz-server-side-encryption-customer-algorithm", ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION)
objectMetadata.setHeader("x-amz-server-side-encryption-customer-key", key2)
objectMetadata.setHeader("x-amz-server-side-encryption-customer-key-MD5", md5)
标头中需要这 3 个值,但它不会在亚马逊服务器上加密文件,我正在通过此代码生成客户密钥和 md5 密钥
@Throws(Exception::class)
fun encrypt(
plaintext: ByteArray?,
password: CharArray,
key: SecretKey,
IV: ByteArray?,
salt: ByteArray
): ByteArray? {
val cipher = Cipher.getInstance("AES")
val pbKeySpec = PBEKeySpec(password, salt, 1324, 256)
val secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
val keyBytes = secretKeyFactory.generateSecret(pbKeySpec).encoded
val keySpec = SecretKeySpec(keyBytes, "AES")
val ivSpec = IvParameterSpec(IV)
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec)
return cipher.doFinal(plaintext)
}
val key2 = Base64.getEncoder().encodeToString(encrypt(utf8, chr, key, iv, salt)) // This is how am calling the function and making base64 customer key
然后对于 md5 使用此代码创建 md5 密钥
val md = MessageDigest.getInstance("MD5")
Files.newInputStream(Paths.get(files[j].path)).use { `is` ->
DigestInputStream(`is`, md).use { }
}
val digest: ByteArray = md.digest(files[j].path.encodeToByteArray())
val md5 = Base64.getEncoder().encodeToString(digest)
文件已成功上传到 aws 服务器,但文件未加密,我似乎无法弄清楚是什么问题
【问题讨论】:
-
我想知道如何检查文件是否加密。如果您使用拥有 KMS 密钥的所有权利并进行解密的帐户进入您的存储桶,那么与没有加密的情况相比,您不会看到任何不同的东西。为了检查对象是否被加密,您必须进入对象属性并检查是否启用了
Server-side encryption settings,或者担任没有解密对象所需权限的角色。 -
@Ervin 感谢您的回复。是的,服务器端加密已启用
-
基本上我会尝试使用其 aes base64 编码密钥下载文件。从。网络后端。它没有提供密钥下载,但它成功下载并在不提供密钥时打开。
-
同时我正在提供 aws s3 服务器的密钥。
标签: android amazon-web-services amazon-s3 aes awss3transferutility