我在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中)。哪种加密方法最好,或者这种方法有自己的弱点。
谢谢。
答案 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数据。