我目前正在为我的某个网站开发更好的登录例程,我想安全地将登录数据传输到服务器。关于这个主题有几篇文章和帖子,但他们经常对如何完成这些文章和帖子有不同的看法。
从SSL开始,漂亮的每个人都在同一页面上:你应该使用SSL,我这样做。然后有些人说:"这就够了,使用SSL,你可以发送用户名& PW作为明文"。我不同意。其他人说它应该仍然是哈希。我读了几篇帖子,我觉得人们关心登录例程的不同方面,并建议只处理其安全方面的机制。
所以我想知道的是,如果我迄今为止所阐述的例程足够,太多或太少。我将尝试解释为什么我选择实现某个功能以及我试图涵盖的安全方面:
服务器和客户端之间的通信应始终为https:// - 尽管如此,我还是阅读了几篇文章,警告说SSL不是"没有银弹",但这是一个良好的开端。
许多评论确实拒绝了PW。使用散列,将其与数据库中的HASHed PW进行比较只会将PW从用户输入更改为HASH - 攻击者仍然可以通过简单地获取HASH来访问。我同意。但是(这是我的意思是人们阅读安全的不同方面)那些人声称它比发送明文更好,因为在这种情况下,只有你的系统,而不是其他具有相同PW的系统会受到损害(当然,除非他们也使用哈希PW)。所以我会在通过SSL发送密码之前实现HASHing密码。
假设SSL无法隐藏我们发送给服务器的数据,攻击者会读取HASHed PW。我可以考虑调整此方案的安全性的唯一方法是使用事先由服务器发送的密钥加密(例如,AES CBC)客户端HASHed PW,并且具有短的有效期。密钥必须随机生成。像这样,服务器可以解密数据,然后将HASH与数据库中的HASH进行比较。
总结一下:
- >客户希望通过SSL登录 - >服务器发回密钥 - > PW的客户端散列 - >客户端用密钥加密HASH和随机IV - >服务器使用密钥(存储在$ _SESSION中,具有到期时间戳)对数据进行解密,并将HASH与其数据库中的HASH进行比较(如果到期时间戳仍然有效)。
这会是一个好方法吗?或者这太多了? (可以有太多安全措施吗?)或者您有其他替代解决方案吗?
答案 0 :(得分:5)
或者这太多了? (可以有太多安全措施吗?)
你在谈论它就像安全是一种液体,必须填满一个容器而不会溢出它。这不是它的工作原理而你提出错误的问题,这意味着你正试图解决错误的问题。它与你积累的措施数量无关,而是它们是否以及如何解决特定问题。
如果问题是保护传输中的数据,那么解决方案就是TLS(SSL) - 这就是它专门设计的内容,在最好的情况下,你能想到的任何东西都是一个糟糕的选择它。你不能超越已经进入TLS的数十年的研究和实践。
杰伊布兰查德已经回答了这个问题,但是......我想指出你所犯的错误,因为否则它看起来就像一个人的话语而另一个人(你可能会听,但其他读者可能不会):
- SSL
醇>服务器和客户端之间的通信应该始终是https:// - 尽管如此,我读过几篇警告说SSL是“没有银弹”的文章,但这是一个好的开始。
它既是银弹,也不是银弹,取决于你如何看待它。
当我们谈论保护传输中的数据时,它就是解决方案 - 在某种程度上是一颗银弹。
但这并不意味着及时找不到瑕疵,或者你只是打开它并说“我有TLS,我很安全!” - 不,它仍然需要适当的配置,维护和长期调整。从这个意义上说,它不是一颗银弹 它也没有解决许多其他安全问题,所以当有人问“我如何使我的应用程序安全?”时,你当然会说这不是一个银弹 - 许多威胁需要单独解决而且没有人为他们所有人停止购物。
- Hash PW clientside(SHA3,ARGON2i,BCRYPT):
醇>许多评论确实拒绝了PW。使用散列,将其与数据库中的HASHed PW进行比较只会将PW从用户输入更改为HASH - 攻击者仍然可以通过简单地获取HASH来访问。我同意。但是(这是我的意思是人们阅读安全的不同方面)那些人声称它比发送明文更好,因为在这种情况下,只有你的系统,而不是其他具有相同PW的系统会受到损害(当然,除非他们也使用哈希PW)。所以我会在通过SSL发送密码之前实现HASHing密码。
恰恰相反 - 当您在客户端散列密码时,只有在您的网站上的帐户才会在数据泄露后更容易受到攻击。
查找数据库中的哈希值 - 在那里获得密码,这是你想出的部分。但是这个哈希仍然是某个用户提供的字符串的结果......没有什么能阻止攻击者使用相同的技术来破解哈希以便破坏其他服务器上的帐户。
所以,这并没有以任何方式解决问题,但你可能会认为在最糟糕的情况下它没有做任何坏事......嗯,间接它确实 - 你必须付出相当大的努力,实施有很多潜在错误的事情 在最好的情况下,你只是在浪费时间,但是一个小错误可能是一个主要的漏洞。
此外,SHA-3是加密原语 - 它有许多设备,但主要是作为构建块。你不能只把它的一轮放在一个密码上,并对产生的哈希感到满意 为了进行比较,bcrypt在内部使用Blowfish(作为与SHA-3相同类型的原语),但是你不能将Blowfish等同于bcrypt。
- 加密HASH:
醇>假设SSL无法隐藏我们发送给服务器的数据,攻击者会读取HASHed PW。我可以考虑调整此方案的安全性的唯一方法是使用事先由服务器发送的密钥加密(例如,AES CBC)客户端HASHed PW,并且具有短的有效期。密钥必须随机生成。像这样,服务器可以解密数据,然后将HASH与数据库中的HASH进行比较。
加密密码哈希有正当理由,但不是为了这个目的,当然也不是在客户端。
您需要一个安全的密钥交换协议才能实现这一目标。猜猜你是怎么做到的? TLS。
通过线路传递加密密钥或密码几乎没有什么不同。那么,即使这在某种程度上是保护密码的解决方案,您又如何在密钥本身上再次应用它?这毫无意义。
答案 1 :(得分:4)
SSL很好,我不知道为什么你不同意。客户端散列仍然可以在客户端以及散列上看到PW,所以没有在那里获得。
问题归结为,“你在保护什么?”我的猜测是你不需要保护任何需要比银行更安全的东西,而且可能不会那么多。
你花了很多时间在这里重新发明轮子,而不是依靠尝试过的方法。坚持已经证实的东西。
答案 2 :(得分:1)
- >客户希望通过SSL登录 - >服务器发回密钥 - > PW的客户端散列 - >客户端用密钥加密HASH和随机IV - >服务器使用密钥(存储在$ _SESSION中,带有到期时间戳)对数据进行解密,并将HASH与其数据库中的HASH进行比较(如果到期时间戳仍然有效)。
为什么要加密哈希?这意味着哈希不够安全。好的,好的,让我们一起去吧。因此,让我们假设攻击者能够读取哈希值,这就是您希望使用附加层保护它的原因。如果攻击者能够读取哈希值,他们也可以读取服务器发送给客户端的密钥,以及包含加密算法的Javascript(假设您正在谈论这里的HTML场景)。现在,攻击者拥有复制和反转加密的所有功能,事实上,他们可能也可以在一开始就改变从服务器发送到客户端的Javascript。
为防止发生,您需要一些保护客户端和服务器之间所有通信的包装器,例如,哦,嗯,说... SSL。< /强>
由于SSL已经保护通信免受第三方干扰......您认为您正在添加哪些额外的歌曲和舞蹈?我告诉你:没事。