【问题标题】:How to store passwords on hard drive the right way? [closed]如何以正确的方式将密码存储在硬盘上? [关闭]
【发布时间】:2024-01-20 00:45:01
【问题描述】:

脚本用于每天通过用户交互发送电子邮件(仅限 Gmail)。我想将他们的电子邮件以纯文本文件的形式存储在硬盘中。什么是正确的方法?

  • 我知道一种方法是要求用户输入密码以保护电子邮件密码,但这种方法没有意义,因为用户每次发送电子邮件时都应输入新密码,所以我而是询问他们的电子邮件密码。

  • 另一种方法是加密密码并使用包含特定信息组合的密钥,例如计算机名+用户名+系统+...,并使用相同的密钥解密加密的密码。问题在于,我使用的是易于反编译的Autoit,因此当潜在的攻击者获得加密密码时,他们理论上可以知道加密密钥,所以我使用谁的许多 uniq 信息来加密并不重要密码,他们无论如何都可以得到它。

  • 另一种方法是对 gmail 使用 OAuth,因此用户根本不需要输入密码,但我不能这样做。

有什么想法吗?

【问题讨论】:

  • 什么操作系统?编程环境? (我问一些操作系统和框架有帮助你的工具)
  • 语言为Autoit 脚本,仅适用于Windows。

标签: security passwords gmail password-protection autoit


【解决方案1】:

由于您是在 Windows 上编程,我建议您查看 Windows API 来为您完成加密工作。假设您不愿意做出不同的假设(例如:TPM),您可以相信它们比您自己发明的更好。

如果您想针对该操作系统,现在在 Win8 上有一个 PasswordVault 类。 在

这些都不是特定于 GMail 的……这只是一般的“在 Windows 上安全地存储东西”之类的建议。您应该追求更好的特定于 gmail 的方式(例如:服务特定凭证)。但即使您这样做了,这也是将其存储在客户端操作系统上的更好方法。

【讨论】:

    【解决方案2】:

    正如 Eric 所提到的,如果您使用的是 Windows,DPAPI 是您的最佳选择。 http://msdn.microsoft.com/en-us/library/ms995355.aspx 函数 CryptProtectData() 使用该特定用户的 Windows 登录信息来加密数据,以便系统上的其他用户无法解密您存储的纯文本。

    【讨论】:

      【解决方案3】:

      AutoIt 有 _Crypt...() 函数可用于此。您可以散列@computername 或@username,并将散列用作_Crypt_DeriveKey() 函数的密钥,以本地化其密码的使用。然后使用密钥将密码字符串作为数据传递给 _Crypt_EncryptData()。将加密密钥存储在您的纯文本文件中。

      当您调用它时,读取文件,使用 _Crypt_DeriveKey() 再次创建密钥,然后使用 _Crypt_DecryptData() 对其进行解密。后一个函数的输出应该是你的密码。

      Crypt.au3 利用 WinAPI 函数进行加密。

      【讨论】:

      • 你没有读过这个问题,我讨厌那个......第二个要点。我做了完全一样的,但我不喜欢它。我想要一个解决方案,您可以在其中看到加密方法(代码)但仍然无法解密密码。
      • 我听说最新版本的 AutoIt 更难反编译,因为旧版本使用的反编译器不适用于最新版本。这是我从不同来源看到的信息。不幸的是,反编译的话题在 autoitscript.com 论坛中是不受限制的,所以我无法确认这一点。此外,接受的答案与我的几乎相同。两种方式都访问 WinAPI 来执行加密......所以我想我会给出使用 AutoIt 的 UDF 的答案。所以无论哪种方式,如果有人反编译它,他们会看到针对 API DLL 的 _Crypt...() 或 DllCall()
      • 修复上面的注释,他们不会看到实际的函数,而是调用 WinAPI 来加密函数的 C++ 代码。所以它们将是同义词。
      最近更新 更多