在nodejs中没有数据库进行身份验证

时间:2018-03-31 18:46:46

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

我在aws lambda上创建一个无数据库的网站。用户将能够发布消息。如果他有正确的密码(这将是一个像example.com/pageid/edit/passwordkey/的网址),他也可以编辑页面。我希望能够在没有数据库的情况下对用户进行身份验证。我使用的是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});
    }
}

这种方法的问题是,如果在将来某个人有人学习这个词语。他们可以访问网站上的每个数据,因为pageid是公开的。

我不擅长加密主题,我只有一些基本的理解,所以我不确定这是否可行。我怎样才能在nodejs上创建它。更具体地说,我想使用SSL加密来生成公钥和私钥。因此,我不依赖于我将来无法改变的单一盐。

  • 我生成公钥和私钥
  • 我使用该文件保存公钥,为用户提供私钥
  • 当我进行身份验证时,我只需使用文件上的公钥加密消息,并使用用户提供的私钥对其进行解密。如果消息相同,我会对用户进行身份验证。

我不知道哪些库可以执行此操作(更具体地说,在nodejs中)。哪种加密方法最好,或者这种方法有自己的弱点。

谢谢。

2 个答案:

答案 0 :(得分:0)

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

  

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

现在您使用S3作为数据库(数据存储区)。如您所见,您需要将数据存储在某处。

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

恕我直言,可能仍然可以在请求中发送一个秘密来授权一个动作(用API密钥或基本身份验证完成),但我不会建议把它放到url中。它可以是有效负载,标头,任何未直接缓存或记录的内容。

  

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

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

  

我不擅长加密主题,我只有一些理解,所以我不确定这是否可行。我怎样才能在nodejs

上创建它

不幸的是,密码学是一个广泛的话题,很容易在腿上拍摄。

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

答案 1 :(得分:0)

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

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