IM如何安全地记住密码?

时间:2009-11-06 23:30:36

标签: passwords security

msn messenger和其他人如何提供一种方法来记住磁盘上的密码,然后将其发送到服务器以便以后进行身份验证? 我搜索了这个主题并找到了一些解决方案,比如BCrypt。但是它存储散列值,我无法将其发送到服务器进行身份验证。 其他建议不保存,但这不是很实用,因为每次我的应用程序启动时我都要求用户输入密码,这非常烦人

9 个答案:

答案 0 :(得分:4)

你并没有真正说出你问的是哪个系统。 Mac OS X提供Keychain Services来处理这种秘密存储。 This question谈论Windows等价物。

答案 1 :(得分:3)

  

msn messenger和其他人如何提供一种方法来记住磁盘上的密码,然后将其发送到服务器以便以后进行身份验证?

他们对其进行加密,存储,然后在加载时对其进行解密。正确执行此操作的人将使用DPAPI将密钥绑定到Windows用户的登录名。 (这是以前使用“受保护的存储”完成的。)

这仍然不是“安全”,就像你可以以该用户身份登录那样,没有什么可以阻止你解密它。但至少与单独在应用程序中内置“秘密”密钥的常见方法相比,它降低了风险。

答案 2 :(得分:2)

您使用应用程序中硬编码的“秘密”双向密钥加密密码。

是的,您的程序可以通过逆向工程(具有各种难度,但绝不可能)来发现内部密钥。没有办法解决这个问题。

答案 3 :(得分:2)

你不能。

准确地说,您不能编写直接将密码写入磁盘的程序,然后继续提取该密码而不要求任何外部输入。如果你的程序可以做到,那么另一个。你可以希望这些方面最好的是模糊处理。

在限制性更强的场景中你可以做些聪明的事情(智能卡?TPM?存在集中的“钥匙串”?),你可能无法想象。

我的意见:这不是什么大问题。绝对应该有一个不保存公共机器密码的选项,但是你也可以将它们存储在纯文本中。也许你会以一些微不足道的方式对它进行模糊处理,以便攻击者至少需要知道他们在做什么,但是为此做很多工作毫无意义。

答案 4 :(得分:2)

简而言之,它没有。根据软件的不同,它可能会加密磁盘上的密码。我认为firefox使用保存的密码做这样的事情。但是,这只会模糊密码。由于程序还必须将加密密钥存储在磁盘上,因此可以找到它并用于解密密码。

这个问题有两种可能的解决方案:

  • 首先是简单地要求用户输入密码。钥匙串类型程序通常在释放存储的密码之前询问用户密码。因此,来自用户的密码可用于加密密码文件。这个系统的好处是可以使用单个密码来聚合系统中的所有其他密码(而不是让用户记住每个密码)。

  • 第二种是使用大多数现代商用电脑(尤其是笔记本电脑)中的TPM安全芯片。这是一个硬件设备,理论上允许您安全地存储加密密钥。通过这种方式,您可以安全地存储加密密钥。但是,您必须依赖硬件设备以及支持它的整个软件基础架构(您不能仅使用隔离我不相信)。

您选择如何解决此问题取决于您尝试做什么。如果您正在编写信使客户端,那么您可能只需使用某种类型的简单加密保存密码,加密密钥存储在其他地方。根据您使用的平台,应该有用于此的库。如果您正在为HBI数据开发某种类型的数据保险库,您将需要找到使用TPM芯片的用途。如果您的平台有某种类型的密钥环应用程序,您可能希望尽可能使用它。

答案 5 :(得分:0)

他们要么以未加密的方式保存,要么使用对称加密,或者将其保存为哈希并以相同的方式将其发送到服务器,而不是关心实际的密码。

编辑:当然,对此答案的评论是正确的。存储和发送哈希肯定不是它的完成方式。谢谢你的纠正。

答案 6 :(得分:0)

通常本地存储的密码是加密的,因此很难破解...但是由于解密它的密钥位于同一台机器(IM内部),因此这种加密绝不是防弹的。

答案 7 :(得分:0)

我不知道特定的IM客户端使用了什么,但如果是我,我会使用challenge/response authentication。这样,密码永远不会通过网络发送。

答案 8 :(得分:-1)

在客户端应用程序中以与在服务器上相同的方式对其进行哈希处理,您可以省去以这种方式发送实际密码的需要。

显然,你必须在发送时再次哈希哈希,否则哈希变成密码,但你可以在服务器上做同样的事情。在身份验证消息中使用一些随机令牌。

添加这听起来并不像评论那样难以理解:

如果您使用原始密码(纯文本)将其与诸如MAC地址,电子邮件地址,用户名或者您可以在服务器上重现的任何内容连接起来,那么您将使用密码并存储相对安全的哈希值。

在身份验证之后,您不仅仅发送此哈希,因为这会完全破坏哈希过程的目的,您可以随机生成一个随机数并在再次进行哈希之前将其与第一个哈希连接。然后在服务器上,你得到nonce和new hash,你用它来验证你的服务器端哈希值,从而验证最初输入的明文密码,而不用存储或传输它。