【问题标题】:Authenticating without a database in nodejs在nodejs中没有数据库的身份验证
【发布时间】:2018-09-10 11:42:02
【问题描述】:

我正在 aws lambda 上创建一个无数据库网站。用户将能够发布消息。如果他有正确的密码(例如 example.com/pageid/edit/passwordkey/ 之类的 url),他也可以编辑页面。我希望能够在没有数据库的情况下对用户进行身份验证。我正在使用 s3,但 s3 上的数据将是公开的,因此我无法将密码存储在 s3 中。

这是我目前的解决方案:

function save(pageid,data){
    s3.putObject({Key:pageid,Body:data});
    password = sha256(pageid + "SALTPHRASE");
    print({password:password});
}
function authenticate(pageid,password,newdata){
    if(sha256(pageid+"SALTPHRASE") == password){
        s3.putObject({Key:pageid,Body:newdata});
    }
}

这种方法的问题是,是否有人在将来的任何日期学习了saltphrase。他们可以访问网站上的所有数据,因为 pageid 是公开的。

我不擅长加密主题,我只有一些基本的了解,所以我不确定这是否可行。我怎样才能在nodejs上做到这一点。更具体地说,我想使用类似 SSL 的加密来生成公钥和私钥。这样我就不会依赖一种我以后无法改变的盐。

  • 我生成了一个公钥和私钥
  • 我将公钥与文件一起保存,将私钥提供给用户
  • 在进行身份验证时,我只需使用文件上的公钥加密消息,然后使用用户提供的私钥对其进行解密。如果消息相同,我将对用户进行身份验证。

我不知道哪些库可以做到这一点(更具体地说是在 nodejs 中)。哪种加密方法最好,或者这种方法是否有其自身的弱点。

谢谢。

【问题讨论】:

  • 请将您的问题限制在一个主题/问题上,否则您将无法获得完整的答案

标签: javascript node.js encryption passwords public-key-encryption


【解决方案1】:

坚持使用 AWS 时,您可能需要查看 Cognito 服务进行身份验证。它实际上是一个完整的身份管理(管理用户、组等),具有联合选项和社交网络登录。对于公共访问,它具有慷慨的免费套餐和合理的价格。 (您需要了解 OAuth 并仔细阅读 Cognito 文档)

希望能够在没有数据库的情况下对用户进行身份验证

现在您将 S3 用作数据库(数据存储)。正如您发现的那样,您需要将数据存储在某个地方。

根据您的用例,我假设您想验证一个秘密(密码?)来授权操作。如果您想在没有任何数据库的情况下完全无服务器,您可能需要使用 lambda 环境变量来存储一些秘密(例如盐、密码哈希......)。

恕我直言,在请求中发送秘密以授权操作(通过 API 密钥或基本身份验证完成)可能仍然可行,但我不建议将其放入 url。它可能位于有效负载、标头以及任何未直接缓存或记录的内容中。

我不知道哪些库可以做到这一点

对于对称加密和散列,我使用 crypto-js,但是这个库不支持 RSA 或 PBKDF。

我不擅长加密主题,我只有一些了解,所以我不确定这是否可行。以及如何在 nodejs 上实现它

不幸的是,密码学是一个广泛的话题,很容易把自己开枪打死。

对于每个主题,我建议在网上搜索,尝试一下,然后在遇到问题时创建一个新的特定问题

【讨论】:

    【解决方案2】:

    如果您想在没有数据库的情况下对用户进行身份验证,请查看 AWS cognito 服务。

    要从 S3 进行身份验证,您可以将用户数据存储为 JSON 或 CSV 文件,并使用 AWS Athena 查询 S3 数据。

    【讨论】:

    • 我想使用加密认证。
    猜你喜欢
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2013-08-12
    • 2018-02-01
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多