在哪里存储凭据?

时间:2017-11-04 10:19:08

标签: node.js security file-upload amazon-s3 image-uploading

我正在构建一个包含图片上传功能的应用,我决定使用Aws S3作为文件存储服务。要将图像上载到aws s3,您需要为API提供服务凭据。为了保证这些凭据的安全,我决定将它们存储在我自己的服务器中,并且只在需要上传图像时将它们提供给客户端。

以下是我上传图片的程序:

1)客户从相机胶卷中选择图像并点击上传按钮

2)应用程序向我自己的服务器发出请求,并通过图像托管服务的访问密钥获取响应(aws s3)

3)客户端现在可以将图像上传到aws s3。上传完成后,将从客户端删除凭据。

我的问题是:

1)这样做是否安全? - 有没有更好的方法来处理这个问题?

2)我应该在哪里将凭证存储在我的服务器中以保证它们的安全?我的意思是我应该将它们存储在文件,数据库和代码中吗?

*我使用graphql / expressjs作为后端,并将原生作为前端进行反应。

2 个答案:

答案 0 :(得分:2)

但是,就位置而言,对于您将要遇到的大多数情况(我真的不能想到任何反例),在数据库中存储密码的表示形式是正确的事情。通过表示我的意思是你想要使用salt(对每个用户应该是不同的)和一​​个安全的单向算法来存储密码并存储它,丢弃原始密码。然后,当您想验证密码时,您可以散列该值(使用相同的散列算法和salt)并将其与数据库中的散列值进行比较。

如何最好地存储用户信息以及用户登录名和密码 存储数据库密码的最佳实践 保存密码:最佳实践? 在php变量或php常量中以明文形式存储密码是否可以? 为了进一步澄清盐渍位,只需对密码进行哈希处理以及存储密码,即如果侵入者掌握了数据库,他们仍然可以使用所谓的彩虹表来解决这个问题。解密"密码(至少在彩虹表中显示的密码)。为了解决这个问题,开发人员为密码添加了一个盐,如果做得好,使彩虹攻击变得不可行。请注意,一个常见的误解是简单地为所有密码添加相同的唯一和长字符串;虽然这并不可怕,但最好为每个密码添加独特的盐。读更多盐。

salt = http://en.wikipedia.org/wiki/Salt_(cryptography)

答案 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/

https://www.vaultproject.io/