Authentication 用SHA1哈希代替Blowfish进行web身份验证

Authentication 用SHA1哈希代替Blowfish进行web身份验证,authentication,cryptography,hash,nonce,Authentication,Cryptography,Hash,Nonce,由于无法找到blowfish的php/javascript实现,我现在正在考虑使用SHA1哈希来实现基于web的身份验证,但由于缺乏这一特定领域的知识,我无法确定所选择的方法是否足够安全 计划的路线图: 用户密码作为MD5散列存储在服务器上。 服务器以毫秒为单位发出当前时间的公钥MD5哈希 客户端javascript函数将用户密码作为输入,并计算其MD5哈希值 然后,客户端从上面连接公钥和密码散列,并计算结果字符串的SHA1 客户端向服务器发送SHA1散列,在服务器上使用公钥和用户密码MD5散列

由于无法找到blowfish的php/javascript实现,我现在正在考虑使用SHA1哈希来实现基于web的身份验证,但由于缺乏这一特定领域的知识,我无法确定所选择的方法是否足够安全

计划的路线图:

用户密码作为MD5散列存储在服务器上。 服务器以毫秒为单位发出当前时间的公钥MD5哈希 客户端javascript函数将用户密码作为输入,并计算其MD5哈希值 然后,客户端从上面连接公钥和密码散列,并计算结果字符串的SHA1 客户端向服务器发送SHA1散列,在服务器上使用公钥和用户密码MD5散列执行类似的计算 服务器比较哈希值,匹配表示身份验证成功。 不匹配表示身份验证失败,服务器会发出一个新的公钥,有效地使已使用的公钥过期。 现在,有问题的部分是关于在SHA1之前连接两个键,这可能容易受到某种统计或其他攻击吗

是否有任何特定的顺序将密钥连接起来以提高整体质量,即更高的位对加密的可靠性更重要


提前感谢您。

如果您只使用“公钥”,它实际上不是公钥,它是一个,而且应该是随机的,除非您真的希望它在某个时间段内可用,在这种情况下,请确保您与密钥一起使用来生成它,以便对手无法阻止,并且它的大小是固定的,那么连接可能不是问题

也就是说,我有点担心您可能没有经过深思熟虑的安全模型。这到底是为了防止什么样的攻击?用户的密码散列是非盐的,因此密码数据库的中断无论如何都会很容易地显示明文密码,尽管有时间限制的临时状态会减轻被动嗅探器的重播攻击,但这种被动嗅探器无论如何都可能窃取用户的会话密钥。说到这里,为什么不使用会话密钥作为nonce而不是基于时间戳的系统呢

但实际上,为什么不直接使用SSL呢?密码学真的很难做到正确,而且比你我聪明得多的人花了几十年的时间来检查SSL的安全性,以使其正确


编辑:如果您担心MITM攻击,那么除了SSL之外,没有什么能拯救您。时期Mallory只需将超级安全登录表单替换为以明文形式向他发送密码的表单即可。比赛结束了。即使是被动攻击者也可以看到网络上的一切,包括会话cookie。一旦Eve拥有会话cookie,她就将其注入浏览器并已登录。比赛结束了

如果您说您不能使用SSL,那么您需要非常仔细地查看您正试图保护的内容,以及您将缓解的攻击类型。您可能需要实现某种类型的桌面应用程序来进行加密—如果MITM正在运行,那么您就不能信任任何HTML或Javascript—Mallory可以随意替换它们。当然,您的桌面应用程序需要在数据流上实现密钥交换、加密和身份验证,以及对远程主机的身份验证,而SSL正是这样做的。如果正确的话,您可能会使用与SSL几乎相同的算法来实现这一点

如果您决定MITM不在范围内,但您想防止被动攻击,那么您可能需要在Javascript中实现一些严重的加密-我们正在讨论的是一种交换,它生成一个会话密钥,该密钥永远不会通过网络发送,等等,Javascript中的AES来保护密钥,在这一点上,您基本上已经在Javascript中实现了一半的SSL,但有可能存在更多的bug,其中最重要的问题是在Javascript中很难获得安全的随机数

基本上,您可以选择:

不实现任何真正的加密安全显然不是一个选择,因为您正在实现所有这些复杂的身份验证协议 实现一些看起来非常像SSL的东西,只是可能没有那么好 使用SSL。
简言之,如果安全性很重要,请使用SSL。如果没有SSL,请安装它。据我所知,可以运行JS的每个平台也可以处理SSL,因此没有任何借口。

如果您只使用“公钥”,而实际上它不是公钥,那么它是一个,并且应该是随机的,除非您真的希望它在某个时间段内可用,在这种情况下,请确保与密钥一起使用以生成密钥,以便对手无法阻止,并且密钥的大小是固定的,那么连接可能不是问题

也就是说,我有点担心您可能没有经过深思熟虑的安全模型。这到底是为了防止什么样的攻击?用途 r的密码散列是非盐的,因此密码数据库的中断无论如何都会很容易地显示明文密码,而且尽管有时间限制的nonce会减轻被动嗅探器的重播攻击,但这种被动嗅探器无论如何都可能窃取用户的会话密钥。说到这里,为什么不使用会话密钥作为nonce而不是基于时间戳的系统呢

但实际上,为什么不直接使用SSL呢?密码学真的很难做到正确,而且比你我聪明得多的人花了几十年的时间来检查SSL的安全性,以使其正确


编辑:如果您担心MITM攻击,那么除了SSL之外,没有什么能拯救您。时期Mallory只需将超级安全登录表单替换为以明文形式向他发送密码的表单即可。比赛结束了。即使是被动攻击者也可以看到网络上的一切,包括会话cookie。一旦Eve拥有会话cookie,她就将其注入浏览器并已登录。比赛结束了

如果您说您不能使用SSL,那么您需要非常仔细地查看您正试图保护的内容,以及您将缓解的攻击类型。您可能需要实现某种类型的桌面应用程序来进行加密—如果MITM正在运行,那么您就不能信任任何HTML或Javascript—Mallory可以随意替换它们。当然,您的桌面应用程序需要在数据流上实现密钥交换、加密和身份验证,以及对远程主机的身份验证,而SSL正是这样做的。如果正确的话,您可能会使用与SSL几乎相同的算法来实现这一点

如果您决定MITM不在范围内,但您想防止被动攻击,那么您可能需要在Javascript中实现一些严重的加密-我们正在讨论的是一种交换,它生成一个会话密钥,该密钥永远不会通过网络发送,等等,Javascript中的AES来保护密钥,在这一点上,您基本上已经在Javascript中实现了一半的SSL,但有可能存在更多的bug,其中最重要的问题是在Javascript中很难获得安全的随机数

基本上,您可以选择:

不实现任何真正的加密安全显然不是一个选择,因为您正在实现所有这些复杂的身份验证协议 实现一些看起来非常像SSL的东西,只是可能没有那么好 使用SSL。
简言之,如果安全性很重要,请使用SSL。如果没有SSL,请安装它。据我所知,每一个可以运行JS的平台也可以处理SSL,所以真的没有理由。

bdonlan绝对正确。正如所指出的,对手只需要用恶意代码替换Javascript表单,这在HTTP上是微不足道的。游戏结束了

我还建议您考虑将密码移动到SHA-2,使用合适的加密随机数生成器生成,即不使用服务器时钟进行种子设定。此外,还要多次执行哈希。见第2节和第3节

MD5坏了。不要使用MD5

您的安全方案需要类似于以下内容:

一切都发生在SSL上。身份验证表单、验证表单的服务器端脚本、图像等等。这里不需要做任何花哨的事情,因为SSL为您完成了所有艰苦的工作。真正需要的只是一个简单的HTML表单,它以明文形式提交用户名/密码,因为SSL将加密所有内容

用户创建新密码:您不是根据服务器时间生成随机salt,而是从良好的加密随机源生成。多次对salt+新密码进行哈希,并将生成的salt&哈希存储在数据库中

验证密码:您的脚本为用户查找salt,并多次散列salt+输入的密码。检查数据库中的匹配项

唯一应该存储在数据库中的是salt和hash/digest

假设您有一个需要支持的MD5哈希数据库,那么解决方案可能是为新的SHA-2哈希和SALT添加数据库列。当用户登录时,您可以像以前一样检查MD5哈希。如果有效,则按照用户创建新密码中的步骤将其转换为SHA-2&salt,然后删除旧的MD5哈希。用户不会知道发生了什么


任何真正偏离这一点的东西都可能会有一些安全缺陷。

bdonlan绝对正确。正如所指出的,对手只需要用恶意代码替换Javascript表单,这在HTTP上是微不足道的。游戏结束了

我还建议您考虑将密码移动到SHA-2,使用合适的加密随机数生成器生成,即不使用服务器时钟进行种子设定。此外,还要多次执行哈希。见第2节和第3节

MD5坏了。不要使用MD5

您的安全方案需要 与以下内容类似:

一切都发生在SSL上。身份验证表单、验证表单的服务器端脚本、图像等等。这里不需要做任何花哨的事情,因为SSL为您完成了所有艰苦的工作。真正需要的只是一个简单的HTML表单,它以明文形式提交用户名/密码,因为SSL将加密所有内容

用户创建新密码:您不是根据服务器时间生成随机salt,而是从良好的加密随机源生成。多次对salt+新密码进行哈希,并将生成的salt&哈希存储在数据库中

验证密码:您的脚本为用户查找salt,并多次散列salt+输入的密码。检查数据库中的匹配项

唯一应该存储在数据库中的是salt和hash/digest

假设您有一个需要支持的MD5哈希数据库,那么解决方案可能是为新的SHA-2哈希和SALT添加数据库列。当用户登录时,您可以像以前一样检查MD5哈希。如果有效,则按照用户创建新密码中的步骤将其转换为SHA-2&salt,然后删除旧的MD5哈希。用户不会知道发生了什么


任何与此相反的内容都可能存在一些安全缺陷。

谢谢您的回复。SSL不是我可以控制的选项,所讨论的系统是为在可能根本不支持SSL的客户端环境中使用而设计的。的确,用户的密码没有被篡改,但我想我们目前正在评估针对中间人攻击的保护措施。现在,如果nonce是非常随机的,并且根据定义,只有一次使用,那么如何使用重放攻击呢?如果您担心MITM攻击,那么除了SSL之外,没有什么可以拯救您。时期Mallory只需将超级安全登录表单替换为以明文形式向他发送密码的表单即可。比赛结束了。即使是被动攻击者也可以看到网络上的一切,包括会话cookie。一旦Eve拥有会话cookie,她就将其注入浏览器并已登录。至于nonce,nonce预测攻击在这里并不真正相关-可以尝试说服用户使用攻击者使用已知的未来时间戳生成的nonce登录。用户将哈希发送给攻击者,然后攻击者等待时间戳出现,然后使用用户的身份验证哈希登录。但是,任何允许这样做的攻击都可能允许你的登录JavaScript被邪恶代码取代。非常感谢你,我相信我看到了这一点,并且会更加认真地考虑。密码1真的很难得到正确的答案。比你我聪明得多的人花了几十年的时间来检查SSL的安全性,以使其正确。谢谢你的回复。SSL不是我可以控制的选项,所讨论的系统是为在可能根本不支持SSL的客户端环境中使用而设计的。的确,用户的密码没有被篡改,但我想我们目前正在评估针对中间人攻击的保护措施。现在,如果nonce是非常随机的,并且根据定义,只有一次使用,那么如何使用重放攻击呢?如果您担心MITM攻击,那么除了SSL之外,没有什么可以拯救您。时期Mallory只需将超级安全登录表单替换为以明文形式向他发送密码的表单即可。比赛结束了。即使是被动攻击者也可以看到网络上的一切,包括会话cookie。一旦Eve拥有会话cookie,她就将其注入浏览器并已登录。至于nonce,nonce预测攻击在这里并不真正相关-可以尝试说服用户使用攻击者使用已知的未来时间戳生成的nonce登录。用户将哈希发送给攻击者,然后攻击者等待时间戳出现,然后使用用户的身份验证哈希登录。但是,任何允许这样做的攻击都可能允许你的登录JavaScript被邪恶代码取代。非常感谢你,我相信我看到了这一点,并且会更加认真地考虑。密码1真的很难得到正确的答案。而比你我聪明得多的人已经花了几十年的时间来检查SSL的安全性,以使其正确。