本地存储密码。在哪里?如何安全通过?

信息安全 加密 密码
2021-09-03 01:54:19

我正在开发一个应用程序。用户必须输入他的凭据,该凭据将被发送到服务器。如果用户第二次打开应用程序,他不需要再次输入它们 - 凭据应该存储在用户的机器上。这些数据也可以传递。我的应用程序是跨平台的,所以我正在寻找一个跨平台的解决方案。所以一步一步的算法应该是这样的:

  1. 用户输入登录名和密码,此数据将发送到服务器。我怎样才能安全地通过它?我应该使用像 https 或 ssl 这样的安全协议吗?
  2. 如果凭据正确,我需要将此数据保存到本地计算机。我应该使用本地数据库文件、二进制文件还是仅使用文本文件?这个文件存放在哪里?我敢打赌我需要对此进行加密。我还需要稍后解密它,但是为了解密我需要一些额外的数据(可能是一些密钥),对吧?在哪里存储这些附加数据?
  3. 在某些时候,我需要将此信息传递给另一个进程。我已经建立了进程之间的 tcp 通信。这足以通过吗?我应该将它加密还是解密。

如果我的步骤有误,请纠正我。这是我第一次处理安全问题,所以我缺乏知识。

3个回答

用户输入登录名和密码,此数据将发送到服务器。我怎样才能安全地通过它?我应该使用像 https 或 ssl 这样的安全协议吗?

是的!您需要以安全方式传递数据,例如使用 TLS。

如果凭据正确,我需要将此数据保存到本地计算机。我应该使用本地数据库文件、二进制文件还是仅使用文本文件?这个文件存放在哪里?我敢打赌我需要对此进行加密。我还需要稍后解密它,但是为了解密我需要一些额外的数据(可能是一些密钥),对吧?在哪里存储这些附加数据?

您可以生成一个密钥而不是密码,例如,在身份验证中,服务器返回一个密钥(随机位),将其保存在具有用户 ID 的数据库中,并且您将该密钥本地存储,但在服务器中您知道属于谁。然后,在第二次登录中,您将该密钥发送到服务器,该服务器检查其是否有效(属于该用户)并且未过期。

在某些时候,我需要将此信息传递给另一个进程。我已经建立了进程之间的 tcp 通信。这足以通过吗?我应该将它加密还是解密。

同样,您只传递密钥。您可以加密,但很难避免您的系统可能遭受的所有类型的攻击。

HTTPS 或使用 TLS 进行加密的自定义协议是与远程服务器安全通信的正确方法,假设您正确实现它并在证书不正确时退出(我见过尽管使用 HTTPS 的移动应用程序,但接受了我的甚至无需询问用户即可立即获得自签名证书,从而使整个“安全性”毫无意义)。

将凭据安全地存储在机器上要困难得多,因为如果您的应用程序可以解密它们,那么恶意软件也可以以与您的应用程序相同的权限运行 - 任何保护都只是默默无闻的安全,并且不会阻止专门的攻击者,它可能仅防止常见的“窃取程序”,这些窃取程序主要用于窃取浏览器配置文件(历史记录、会话 cookie)或个人文件(用于可能的身份盗用),并且不会窃取实际的应用程序二进制文件,因此攻击者将不知道如何保存凭据被加密,或者即使他有应用程序的二进制文件,他也可能不在乎,因为逆向工程非常耗时并且需要经验(请注意,恶意软件开发人员通常不是实际部署它们并收集/转售被盗数据的人)。

您可以从硬件中派生一个密钥,pbkdf2(sha512(OSname+OSversion+CPUmodel+MACaddress))并将其用作加密凭据的密钥,该密钥可以在同一台机器上检索,但如果攻击者只窃取加密的凭据和应用程序的二进制文件,除非他仍然有访问机器以返回并获得相同的值

无需对同一台机器上的进程间通信使用加密,如果攻击者可以拦截他已经控制机器的通信(与应用程序使用的权限级别相同,如果不是更高的话),这意味着您可以阅读我上面所说的关于无法防御的内容。

这就是我的想法,因为我已经构建了这样一个像魅力一样工作的应用程序。

由于您已经在使用 TCP,您可以加密您发送的所有数据并在应用程序内解密它们。

  1. 用户登录和他第一次输入的数据被加密发送到服务器。

  2. 服务器读取加密数据并检查登录是否正确,并向客户端发送回复。

  3. 客户端读取数据并检查是否登录成功。

  4. 令牌存储在应用程序内部,因此用户无需再次输入数据。

  5. 每次用户启动应用程序时,应用程序首先检查登录令牌,然后在加载应用程序的启动屏幕时自动登录。

如果您打算制作消息传递应用程序,或者如果它是与 Web 相关的应用程序,则加密所有传入和传出数据,然后只需加密重要部分。

如果您想使用自定义 TCP,请使用 3 次握手,或者如果您希望使用 HTTPS(如果它与 Web 相关),则使用 HTTPS。

只有一个问题可能会搞砸一切,那就是如果用户机器感染了可以读取从键盘发送的所有数据的键盘记录器。(例如,他第一次必须使用他的登录凭据)

我希望这对您有足够的帮助,可以引导您朝着正确的方向前进。