在我的应用程序中同步/保护敏感数据的正确方法是什么?

时间:2019-01-31 04:34:01

标签: node.js security electron credentials

背景

我离开Web应用程序开发领域已有几年了,最近又回到了它。对于执行以下任务的最佳安全性实践,我有几个问题。

我正在开发一个电子(node.js)应用程序,它将使用我的远程应用程序服务器对用户凭据进行身份验证。在我的服务器上,我有一个MySQL数据库,该数据库将存储各种常规的用户帐户和应用程序数据。此外,电子应用程序将具有本地sqlite数据库,该数据库将定期更新,以使事物与远程MySQL服务器保持同步。如果在离线环境中或在远程服务器关闭的情况下使用电子应用程序,则可以使用Sqlite数据库允许应用程序继续运行。我希望该应用程序首先在线,并具有离线后备功能。

一旦用户在电子应用程序中进行了身份验证,该应用程序将允许该用户执行其工作,并且当用户完成操作后,他们的工作将通过将该工作发布到第三方的API来提交给第三方。用户首次登录时,系统会要求他们使用OAuth2向第三方API进行身份验证,并且成功完成此身份验证过程后,第三方将提供api访问令牌。该令牌将存储在远程MySQL数据库以及本地sqlite数据库中。

这是踢脚线。将有多台机器运行此电子应用程序,因此有必要使所有这些装置之间的一切保持同步,因为同一位用户在特定的一天可能正在使用这些机器中的任何一个。

问题

在没有背景信息的情况下,这是我的问题:

  1. 如果在将用户密码存储在数据库中之前对用户密码进行哈希处理和加盐处理:SHA-512还是安全的哈希,还是还有另一种更好的算法?

  2. 第三方API令牌本质上是访问第三方API的用户密码。我打算这样对待它,并给予与密码相同的对待。由于哈希是单向的,因此不是一种选择,如何最好地加密API令牌以存储在数据库中?我目前的想法是将AES与一个很长的随机生成的字符串一起使用,该字符串存储在服务器应用程序的配置文件中作为密钥。在这种情况下,如果数据库被破坏,则秘密密钥将不包含在数据中。要获取密钥,服务器本身必须被破解。这是解决这个问题的最好方法吗?

  3. 在应用程序启动或手动触发时,本地电子应用程序将查询我的远程服务器,以确定自上次更新本地sqlite数据库以来数据库是否发生了任何更改。如果有更改并且需要本地更新,则远程服务器将发送自上次更新以来所有已更改内容(可能以JSON格式)的响应。本地应用程序与远程服务器之间的连接将使用TLS(https)进行加密。这是否足以保护本地应用程序与远程服务器之间的数据交换(包含密码哈希等),还是应该进一步加密JSON对象?这甚至是同步数据的好方法吗?

我非常感谢您的帮助。我与当前的一些最佳做法有些脱节,这是很长时间以来我的第一个实际生产应用程序,因此我想确保一切都正确完成。

0 个答案:

没有答案