如何对用户隐藏javascript(react native)应用程序中的S3键?

如何对用户隐藏javascript(react native)应用程序中的S3键?,javascript,amazon-web-services,react-native,amazon-s3,amazon-iam,Javascript,Amazon Web Services,React Native,Amazon S3,Amazon Iam,我有一个将文件上传到S3存储桶的应用程序,作为其功能的一部分。我已经让应用程序工作了,但是bucket的密钥在应用程序文件中,因此如果用户有足够的动力,就可以看到密钥。我已经将密钥配置为具有有限的权限,但是我可以做些什么来防止用户看到密钥,或者至少使其混淆?如果应用程序前端需要读取密钥,您几乎无法对用户隐藏它们 根据您的用例,您可以查看一些场景 首先,您可以用临时凭据替换永久凭据,要做到这一点,您可以使用该服务 通过使用此方法,您可以基于以下方法之一: 如果用户必须登录,则可以将其附加到cog

我有一个将文件上传到S3存储桶的应用程序,作为其功能的一部分。我已经让应用程序工作了,但是bucket的密钥在应用程序文件中,因此如果用户有足够的动力,就可以看到密钥。我已经将密钥配置为具有有限的权限,但是我可以做些什么来防止用户看到密钥,或者至少使其混淆?

如果应用程序前端需要读取密钥,您几乎无法对用户隐藏它们

根据您的用例,您可以查看一些场景

首先,您可以用临时凭据替换永久凭据,要做到这一点,您可以使用该服务

通过使用此方法,您可以基于以下方法之一:

  • 如果用户必须登录,则可以将其附加到cognito用户,该用户将为其生成临时凭据
  • Cognito还支持匿名用户(来宾用户),该用户还授予临时凭证

如果应用程序主要是基于写的,那么可以采取的另一种方法是使用预先签名的S3URL上载对象。这将结合一个API网关和一个Lambda来为您生成它,因此前端上不会存储任何凭据。有关如何处理该方法的更多信息,请参阅。

您需要预先签名的URL来提供上载功能,而无需公开密钥。假设您有一个后端,例如Lambda函数,它具有允许上载对象的键

您的后端需要一个应用程序可以访问的端点。然后生成一个签名URL:

const url = s3.createPresignedPost({
    Bucket: <bucket>,
    Fields: {
        key: <filename>,
    },
});
然后发送文件:

const formData = new FormData();
formData.append("Content-Type", file.type);
Object.entries(data.fields).forEach(([k, v]) => {
    formData.append(k, v);
});
formData.append("file", file); // must be the last one
await fetch(data.url, {
    method: "POST",
    body: formData,
});

有很多微妙的事情,你可以设置,以确保它的安全。有关更多信息和示例代码,请参阅。

您可以尝试使用公钥(或私钥)加密密钥。这就是加密存在的原因,不是吗?
await fetch(data.url, {
    method: "POST",
    body: formData,
});