gpt4 book ai didi

javascript - 有关安全性的App API设计建议

转载 作者:行者123 更新时间:2023-11-28 05:48:00 25 4
gpt4 key购买 nike

我正在构建一个应用程序,并希望获得一些有关构建数据同步过程和支持该过程的API的方法的反馈。对于上下文,这些是我的应用程序/ API的指导原则:


免费:我完全不希望向人们收费以使用该应用程序/ API。
开源:应用程序和API的源代码可供公众随意使用。
去中心化:支持该应用程序的API服务可以由任何服务器上的任何人运行,并可供该应用程序的用户使用。
匿名:用户不必注册该服务,也不必提交将与他们的数据一起存储的任何个人识别信息。
安全:将用户数据发送到服务器之前,应先对其进行加密,任何有权访问服务器的人都不应读取用户数据。


我将在公共服务器上实现API的实例,默认情况下会在应用中选择该实例。这样,应用程序的初始用户就可以立即同步其数据,而无需查找或设置API服务的实例。随着时间的流逝,如果该应用程序很流行,则用户希望自己设置API服务的其他实例,或者如果他们希望使用其他实例(或者如果主实例用完了),则可以供该应用程序的其他用户使用。空间,下降等)。他们甚至可以在自己的应用中访问API。本质上,出于隐私,弹性,节省成本等原因,我希望他们能够选择自给自足,而不必一定要依靠其他人为他们提供服务实例。注:数据该问题不敏感(例如财务等),但它是个人的。

用户的同步过程如下:


用户下载该应用程序,并在使用该应用程序的过程中创建其数据。
当用户准备好初始同步时,他们会在密码字段中输入“密码”,该密码用于创建用于加密数据的复杂密钥。他们的密码以纯文本格式存储在本地,但从未发送到服务器。
用户单击“同步”按钮,他们的数据被加密(使用密码)并发送到指定的(或默认的)API实例,并通过给他们一个由应用程序保存的唯一ID进行响应。
对于将来的同步,将使用保存的密码在本地加密数据,然后将其数据连同其唯一ID(在服务器上更新其同步数据)一起发送到API。
检索同步的数据时,它们的唯一ID将发送到API,API会以其加密的数据作为响应。然后将其本地存储的密码用于解密数据以供应用使用。


我已经用javascript实现了该应用程序,并使用MongoDB作为后端在Node.js(重新验证)中实现了API,因此实际上向服务器的同步请求如下所示:

1.初始同步

POST / api /数据

帖子正文:

{
"data":"DWCx6wR9ggPqPRrhU4O4oLN5P09onApoAULX4Xt+ckxswtFNH/QQ+Y/RgxdU+8+8/muo4jo/jKnHssSezvjq6aPvYK+EAzAoRmXenAgUwHOjbiAXFqF8gScbbuLRlF0MsTKn/puIyFnvJd..."
}


响应:

{
"id":"507f191e810c19729de860ea",
"lastUpdated":"2016-07-06T12:43:16.866Z"
}


2.获取同步数据

GET / api / data / 507f191e810c19729de860ea

响应:

{
"data":"DWCx6wR9ggPqPRrhU4O4oLN5P09onApoAULX4Xt+ckxswtFNH/QQ+Y/RgxdU+8+8/muo4jo/jKnHssSezvjq6aPvYK+EAzAoRmXenAgUwHOjbiAXFqF8gScbbuLRlF0MsTKn/puIyFnvJd...",
"lastUpdated":"2016-07-06T12:43:16.866Z"
}


3.更新同步的数据

POST / api / data / 507f191e810c19729de860ea

帖子正文:

{
"data":"DWCx6wR9ggPqPRrhU4O4oLN5P09onApoAULX4Xt+ckxswtFNH/QQ+Y/RgxdU+8+8/muo4jo/jKnHssSezvjq6aPvYK+EAzAoRmXenAgUwHOjbiAXFqF8gScbbuLRlF0MsTKn/puIyFnvJd..."
}


响应:

{
"lastUpdated":"2016-07-06T13:21:23.837Z"
}


他们在MongoDB中的数据如下所示:

{
"id":"507f191e810c19729de860ea",
"data":"DWCx6wR9ggPqPRrhU4O4oLN5P09onApoAULX4Xt+ckxswtFNH/QQ+Y/RgxdU+8+8/muo4jo/jKnHssSezvjq6aPvYK+EAzAoRmXenAgUwHOjbiAXFqF8gScbbuLRlF0MsTKn/puIyFnvJd...",
"lastUpdated":"2016-07-06T13:21:23.837Z"
}


当前使用CryptoJS的AES实现来实现加密。由于该应用程序将用户的密码作为密码提供给AES“加密”功能,因此它会生成一个256位密钥,用于将用户数据加密,然后再发送给API。

关于总结同步过程,这相当简单,但显然需要安全可靠。我担心的是:


由于MongoDB ObjectID相当容易猜测,恶意用户有可能通过猜测其ID来请求他人的数据(按照步骤2。获取同步数据)。但是,如果它们成功,它们将仅检索加密的数据,而没有用于解密它的密钥。这同样适用于有权访问服务器上数据库的任何人。
鉴于上述情况,CryptoJS AES实现是否足够安全,以致在恶意用户检索用户的加密数据的现实可能性中,他们实际上将无法解密数据?
由于该API向任何人开放,并且不审核或检查提交的数据,因此任何人都可能提交他们希望存储在服务中的任何数据,例如:


帖子正文:

{
"data":"This is my anyold data..."
}


在遵循上述指导原则的同时,我能做些实际的事情来预防这种情况吗?


服务的普遍滥用,例如用户一遍又一遍地向初始垃圾邮件(上面的步骤1)发送垃圾邮件,以填满服务器上的空间;或某些用户使用不成比例的大量服务器空间。我已经实现了一些功能来防止这种情况发生,例如将IP记录为一天的初始同步(不保留更长时间),以便将单个IP限制为每天设定的初始同步数。另外,我限制了同步的帖子正文大小。这些选项是可在API中配置的,因此,如果用户不喜欢公共API实例上的这些限制,则他们可以托管自己的实例并根据自己的喜好调整设置。


就是这样,如果有我的指导原则,对于任何对这种方法有任何想法或意见的人,我将不胜感激。我找不到其他应用程序尝试过类似方法的示例,因此,如果有人知道任何示例并可以链接到它们,我将不胜感激。

最佳答案

我不能真正评论特定的AES算法/密钥是否安全,但是假设它们是安全的(并且密钥生成正确),那么其他用户可以访问加密的数据也不应该成为问题。

您可以通过使用验证码或类似的防范自动使用措施来防止滥用,而无需其他帐户。如果您需要在新帐户上使用catcha,并为所有帐户设置数据量和呼叫频率限制,则可以。

为防止意外的明文数据,您可以为每个帐户生成一个辅助密钥,然后使用公用辅助密钥在服务器上检查是否可以解密邮件。像这样:

data = secondary_key(user_private_key(cleartext))


这样,数据将始终被加密,在最坏的情况下,服务器将能够读取数据,而其他服务器则无法。

对您的API的一些注释:)如果您已经在使用HTTP和POST,则实际上不需要 idPOST通常返回指向创建数据的 URI。然后,您可以 GETURI,或 PUT对其进行更改:

POST /api/data
{"data": "..."}


响应:

Location: /api/data/12345
{"data": "...", "lastmodified": "..." }


要更改它:

PUT /api/data/12345
{"data": "..."}


您不必这样做,但是在客户端上实现起来可能会更容易,甚至可以帮助进行缓存和缓存失效。

关于javascript - 有关安全性的App API设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38327484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com