C# 存储一个经过良好哈希处理的密码及其哈希处理方法是否危险?
我正在用C#开发一个客户端应用程序,它将与服务器(php页面)进行通信,以获取凭据和一些关键服务。我想知道在客户端的机器上存储经过良好哈希处理的密码是否危险?我所说的“良好散列”是指使用众所周知的安全散列函数的随机种子。在本讨论中,假设源代码是免费的(因为所有二进制文件都可以进行反向工程)C# 存储一个经过良好哈希处理的密码及其哈希处理方法是否危险?,c#,php,security,hash,C#,Php,Security,Hash,我正在用C#开发一个客户端应用程序,它将与服务器(php页面)进行通信,以获取凭据和一些关键服务。我想知道在客户端的机器上存储经过良好哈希处理的密码是否危险?我所说的“良好散列”是指使用众所周知的安全散列函数的随机种子。在本讨论中,假设源代码是免费的(因为所有二进制文件都可以进行反向工程) 我的想法是将用户名和散列密码存储在用户的计算机上,并通过未加密的http连接将此用户名和散列以明文形式发送到服务器进行验证。当然,这不会阻止黑客在不知道源密码的情况下(通过一些代码调整)使用他人的用户名和密码
我的想法是将用户名和散列密码存储在用户的计算机上,并通过未加密的http连接将此用户名和散列以明文形式发送到服务器进行验证。当然,这不会阻止黑客在不知道源密码的情况下(通过一些代码调整)使用他人的用户名和密码哈希作为自己的用户名和密码哈希
我生产的产品不会是下一个ebay、facebook或stackexchange,而且是低预算的。我不需要什么一流的东西,也不关心盗窃,因为我计划使用“随心所欲”的模式。我主要是出于好奇才发布这篇文章。将散列密码存储在用户的计算机上会使他们面临(相当大的)风险——即使访问您的网站不是特别有价值,许多用户也会在许多网站上使用相同的用户名和密码。如果其中任何一个使用与您相同(如您所说,众所周知)的哈希函数,则访问该数据会使攻击者能够访问这些其他网站 对于一个简单、低预算的方法,我会使用一个简单的挑战/响应系统。当用户要求登录时,向他们发送一个随机数字。他们将密码输入客户端程序,客户端程序对其进行散列,并使用散列后的密码作为密钥对随机数进行加密,然后将结果发送到服务器。服务器使用其存储的用户密码哈希来加密相同的随机数。当它从用户那里得到结果时,它会比较两者。当且仅当两个密码匹配时,用户才具有正确的密码 如果您的目的是避免用户必须始终输入密码,请将随机数和加密的随机数存储在他们的计算机上。只要他们收到相同的挑战,他们就可以发送相同的响应。当/如果质询发生更改,他们需要重新输入密码以加密新质询。恢复存储的数据只会让攻击者访问您的站点,而且访问时间相当短(而且尽早更改挑战也很简单) 这完全避免了传输密码(即使是散列形式)。唯一的例外是在初始设置期间,当您需要将哈希密码输入服务器时。为此,您有两种选择,但PK加密可能是最明显的——您向他们发送密钥,他们发送使用该密钥加密的数据。如果其他人截取了数据,那就没用了(当然,除非他们破坏了加密)
至于如何生成随机数,通常的方法非常简单:从服务器上的
/dev/random
之类的源代码生成一个真正的随机数。将其(散列版本)用作加密算法的密钥,该算法在计数器模式下运行-即,您有一个计数器(您不必保密),您使用该密钥加密(您确实保密)。每次需要生成新的质询时,您都会增加计数器,对其进行加密并发送结果。我强烈反对尝试创建自己的身份验证方案。如果您使用经过时间测试的模式,则更有可能覆盖您未考虑的边缘情况。以下是我的建议和原因: