【问题标题】:Where to store credentials?在哪里存储凭据?
【发布时间】:2017-11-04 10:19:08
【问题描述】:

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

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

  1. 客户端从相机胶卷中选择图片并点击上传按钮

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

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

我的问题是:

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

  2. 我应该将凭据存储在服务器的什么位置以确保它们的安全?我的意思是我应该将它们存储在文件、数据库、代码中吗?

*我使用graphql/expressjs作为后端,react native作为前端。

【问题讨论】:

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


【解决方案1】:

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

-- 不,它不安全,您应该生成签名的 url 并将其发送给您的客户端,客户端将使用该签名的 url 直接发布到 s3。 (http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html)

2) 我应该将凭据存储在服务器的什么位置以确保它们的安全?我的意思是我应该将它们存储在文件、数据库、代码中吗?

-- 始终将凭据存储在 aws 参数存储区或 hashcorp vault 中,当应用启动时,调用它并获取凭据。

(https://aws.amazon.com/ec2/systems-manager/parameter-store/)

(https://www.vaultproject.io/)

【讨论】:

  • 非常感谢!这很有帮助!
【解决方案2】:

但是,就位置而言,对于您将遇到的大多数情况(老实说,我想不出任何反例)在数据库中存储密码表示是正确的做。通过表示,我的意思是您想使用盐(每个用户应该不同)和安全的单向算法对密码进行哈希处理并存储它,丢弃原始密码。然后,当您要验证密码时,您对值进行哈希处理(使用相同的哈希算法和盐)并将其与数据库中的哈希值进行比较。

如何最好地存储用户信息和用户登录名和密码 存储数据库密码的最佳实践 加盐密码:最佳实践? 可以将密码以纯文本形式存储在 php 变量或 php 常量中吗? 为了进一步澄清盐渍位,简单地散列密码并存储的危险在于,如果侵入者控制了您的数据库,他们仍然可以使用所谓的彩虹表来“解密”密码(至少是出现在彩虹表中的密码)。为了解决这个问题,开发人员在密码中添加了盐,如果正确完成,彩虹攻击根本不可能进行。请注意,一个常见的误解是简单地将相同的唯一且长字符串添加到所有密码中;虽然这并不可怕,但最好为每个密码添加唯一的盐。阅读更多关于盐的内容。

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

【讨论】:

  • 感谢 Anser,Ankit。问题是我想直接从客户端上传图像以减少服务器上的工作。因此,必须将凭据从客户端发送到 aws s3 服务器,而无需加密。
  • 好的,然后检查 AWS s3 服务器是否为您提供了一些东西来安全地存储您的凭证。我敢肯定他们有东西给你。美好的一天!
  • 您在 AWS s3 中找到什么了吗?
  • 是的,请参阅@Madhan S 的回答。
猜你喜欢
  • 2021-02-20
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 2014-09-07
  • 2023-03-24
相关资源
最近更新 更多