在哪里存储凭据?

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

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

1)客户端从相机胶卷select图像并点击上传button

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

3)客户端现在可以上传图片到aws s3。 上传完成后,客户端将删除证书。

我的问题是:

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

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

*我使用graphql / expressjs作为后端,并将本机作为前端进行响应。

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

– 没有不安全的,你应该生成签名的url,并将其发送到您的客户端,客户端将直接张贴到s3使用该签名的url。 ( 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/

然而,就位置而言,对于大多数情况下,你将遇到的(我真的不能想到任何反例)将密码的表示存储在数据库中是正确的事情。 通过表示,我的意思是说,你想散列密码使用盐(这应该是每个用户不同)和一个安全的单向algorithm和存储,扔掉原来的密码。 然后,当你想validation一个密码,你散列值(使用相同的散列algorithm和盐),并将其与数据库中的哈希值进行比较。

如何最好地存储用户信息和用户login名和密码存储数据库密码的最佳实践唾沫密码:最佳实践? 以纯文本forms存储密码在PHPvariables或PHP常量是否可以? 为了进一步澄清腌制位,只需简单地对一个密码进行散列和存储,即如果一名侵入者获得了数据库的保留,他们仍然可以使用所谓的彩虹表来“解密”密码(至less在彩虹表中显示的那些)。 为了解决这个问题,开发人员在密码中添加一个盐,如果做得好的话,彩虹的攻击是不可行的。 请注意,一个常见的误解是简单地为所有密码添加相同的唯一string和长string; 虽然这并不可怕,但最好为每个密码添加独特的盐。 多读盐。

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