存储密码和密码的方法很危险吗?

Joh*_*ald 6 php c# security hash

我正在使用C#开发一个客户端应用程序,它将与服务器(php页面)进行通信以获取凭据和一些关键服务.我想知道在客户端的机器上存储一个良好的哈希密码是否危险?通过"well hashed",我的意思是使用一个众所周知的安全散列函数随机种子.出于本讨论的目的,假设源是免费提供的(因为所有二进制文件都可以进行逆向工程).

我的想法是,我会在用户的计算机上存储用户名和散列密码,并且该用户名和散列将以纯文本形式通过未加密的http连接发送到服务器以进行验证.这当然不会阻止黑客在不知道源密码的情况下使用别人的用户名和密码哈希(通过一些代码调整).

  1. 恶意个人是否能够使用散列密码和用于生成散列的代码执行任何操作?(如果他们获得此信息,则以其他用户身份登录)
  2. 如果黑客无权访问源密码,其他客户端应用程序如何防止一个用户以其他用户身份登录?(例如Steam)
  3. 是否有一个简单,便宜(成本和时间),更安全的方式来处理这个?

黑客如何使用我当前的逻辑欺骗别人的登录凭据的示例:

  1. Legit用户首次登录,凭据存储
  2. 黑客获得对文件系统的访问权限,查找用户名和哈希密码
  3. 黑客修改源代码(或使用代码注入)来发送获取的用户名和散列密码,而不是程序通常会执行的操作

我正在制作的产品不会成为下一个ebay,facebook或stackexchange,并且预算很低.我不需要一些顶级的东西,并且不关心盗窃,因为我计划使用"支付你想要的"模型.我主要是为了好奇而发布这个.

Eri*_*ert 12

首先,我要说你没有能力安全地实施这个系统.我也不是.几乎没有人. 你需要一名安全专业人员来完成这项工作; 如果你试图推出自己的安全性,你就会弄错它,你将产生一个可以被攻击者攻陷的系统.

这样做:你已经清楚地发现了系统的弱点.您正在存储等效密码 ; 如果攻击者获得等效的密码,那么他们是否有密码并不重要; 他们有足够的信息冒充用户.

解决方案很明确.如果你这样做会伤害,不要这样做.如果存储密码的系统不能被信任以抵御攻击,则不要存储等效的密码.

如果你一直在努力存储等效的密码,那么将它存储在一个存储器中,攻击者比文件系统更难获得访问权限.如果您确实代表用户存储危险内容,则可以使用Windows数据保护API将其存储在使用用户凭据加密的加密存储中:

http://msdn.microsoft.com/en-us/library/ms995355.aspx

但最好不要首先存储等效的密码.

假设您没有存储等效的密码.你还没有完成.你仍然需要考虑重播攻击.假设攻击者窃听了不安全的通道.用户输入密码,进行散列并发送到服务器.窃听者记录了哈希密码,现在他们拥有了密码.

为解决此问题,服务器向客户端发送一个随机数.这个号码永远不会再被使用; 这只是一次性的.客户端使用随机数编码散列密码,然后使用服务器的公钥加密结果.加密的xor'd消息被发送到服务器.

服务器使用其私钥对散列进行解密,并使用先前发送的随机数对其进行xors,并确定解密的散列与其存储的等效密码相匹配.现在,窃听者无法重播相应的捕获密码,因为他们永远不会再看到相同的随机数.

现在,如果客户端不知道服务器的公钥,这很容易受到中间人攻击!如果服务器将公钥发送给客户端,那么中间人可以拦截服务器的公钥并用他的公钥替换它.现在,中间人可以提供公钥 "随机"挑战,客户端将放弃等效的密码.

就像我说的,这很难.不要试图自己做.获得专业.


Jer*_*fin 5

在用户的计算机上存储散列密码会使他们面临(相当大的)风险 - 即使访问您的站点不是特别有价值,许多用户也会对许多站点使用相同的用户名和密码.如果他们中的任何一个使用相同的(如您所说,众所周知的)哈希函数,那么访问该数据可以使攻击者访问这些其他网站.

对于简单,低预算的方法,我使用简单的挑战/响应系统.当用户要求登录时,向他们发送一个随机数.他们将密码输入到客户端程序中,该程序将其哈希,并使用散列密码作为密钥来加密随机数,然后将该结果发送到服务器.服务器使用其存储的用户密码哈希来加密相同的随机数.当它从用户获得结果时,它会比较两者.当且仅当两者匹配时,用户才有正确的密码.

如果您的目的是避免用户必须始终输入密码,请将随机数和加密的随机数存储在他们的计算机上.只要他们收到同样的挑战,他们就可以发送相同的回复.当/如果挑战发生变化,他们需要重新输入密码来加密新挑战.恢复存储的数据使攻击者只能访问您的站点,并且只能在相当短的时间内访问(并且更快地更改攻击也是微不足道的).

这样就可以避免传输密码(即使是以散列形式).唯一的例外是在初始设置期间,当您需要将哈希密码输入服务器时.为此,您有几个选择,但PK加密可能是最明显的 - 您向他们发送密钥并发送使用该密钥加密的数据.如果其他人拦截数据,它就没用了(当然,除非他们破解加密).

至于如何生成随机数,通常的方法很简单:从服务器上的源生成一个真正的随机数/dev/random.使用(散列版本)作为加密算法的密钥,您在计数器模式下运行 - 即您有一个计数器(您不必保密),您使用该密钥加密(您保留该密钥)秘密).每次需要产生新的挑战时,都需要递增计数器,加密计数器并发送结果.