我正在构建一个包含图片上传功能的应用,我决定使用Aws S3作为文件存储服务。要将图像上载到aws s3,您需要为API提供服务凭据。为了保证这些凭据的安全,我决定将它们存储在我自己的服务器中,并且只在需要上传图像时将它们提供给客户端。
以下是我上传图片的程序:
1)客户从相机胶卷中选择图像并点击上传按钮
2)应用程序向我自己的服务器发出请求,并通过图像托管服务的访问密钥获取响应(aws s3)
3)客户端现在可以将图像上传到aws s3。上传完成后,将从客户端删除凭据。
我的问题是:
1)这样做是否安全? - 有没有更好的方法来处理这个问题?
2)我应该在哪里将凭证存储在我的服务器中以保证它们的安全?我的意思是我应该将它们存储在文件,数据库和代码中吗?
*我使用graphql / expressjs作为后端,并将原生作为前端进行反应。
答案 0 :(得分:2)
但是,就位置而言,对于您将要遇到的大多数情况(我真的不能想到任何反例),在数据库中存储密码的表示形式是正确的事情。通过表示我的意思是你想要使用salt(对每个用户应该是不同的)和一个安全的单向算法来存储密码并存储它,丢弃原始密码。然后,当您想验证密码时,您可以散列该值(使用相同的散列算法和salt)并将其与数据库中的散列值进行比较。
如何最好地存储用户信息以及用户登录名和密码 存储数据库密码的最佳实践 保存密码:最佳实践? 在php变量或php常量中以明文形式存储密码是否可以? 为了进一步澄清盐渍位,只需对密码进行哈希处理以及存储密码,即如果侵入者掌握了数据库,他们仍然可以使用所谓的彩虹表来解决这个问题。解密"密码(至少在彩虹表中显示的密码)。为了解决这个问题,开发人员为密码添加了一个盐,如果做得好,使彩虹攻击变得不可行。请注意,一个常见的误解是简单地为所有密码添加相同的唯一和长字符串;虽然这并不可怕,但最好为每个密码添加独特的盐。读更多盐。
答案 1 :(得分:2)
1)这样做是否安全? - 有没有更好的方法来处理这个问题?
- 不安全,您应该生成签名网址并将其发送给您的客户端,客户端将使用该签名网址直接发布到s3。 (http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html)
2)我应该在哪里将凭证存储在我的服务器中以保证它们的安全?我的意思是我应该将它们存储在文件中,数据库中,代码中吗?
- 始终将凭据存储在aws参数存储或hashicorp保险库中,当应用程序启动时,请对其进行调用并获取凭据。
(https://aws.amazon.com/ec2/systems-manager/parameter-store/)