Cryptography 这是加密安全的吗?

Cryptography 这是加密安全的吗?,cryptography,Cryptography,我正在制作一个聊天程序,我决定加入加密。然而,我对这一点还不熟悉,所以我想知道的是,这种加密技术安全吗?这是一种很好的方法吗 这是登录: 开始: 客户端发送用户名 如果用户存在,服务器将为用户发送存储的盐 然后,客户端发送SHA-2哈希(Salt+明文密码) 服务器将其与存储的salt+密码的散列结果进行比较,如果相同,则表示用户已成功登录,从此处开始加密 结束 有什么缺点吗?我不认为有,但我不愿意去做程序,只是被告知加密不起作用!还有,有人找到了关于密码学的进一步阅读的好链接吗 简短的回答是“

我正在制作一个聊天程序,我决定加入加密。然而,我对这一点还不熟悉,所以我想知道的是,这种加密技术安全吗?这是一种很好的方法吗

这是登录:

开始:

客户端发送用户名

如果用户存在,服务器将为用户发送存储的盐

然后,客户端发送SHA-2哈希(Salt+明文密码)

服务器将其与存储的salt+密码的散列结果进行比较,如果相同,则表示用户已成功登录,从此处开始加密

结束

有什么缺点吗?我不认为有,但我不愿意去做程序,只是被告知加密不起作用!还有,有人找到了关于密码学的进一步阅读的好链接吗

简短的回答是“不,为什么要冒险呢?”而冗长的回答太长太复杂了。有太多未知的变量,我们无法给出一个好的答案:客户端和服务器之间的链接是否加密?是否验证要连接到的服务器的标识?等等

一般来说,你不应该重新发明轮子,你应该避免自制密码术。对于密码,请考虑使用并保持愉快

如果您想验证用户正在输入的密码,您可能还需要考虑实现一个挑战-响应认证系统,或者至少实现对重放攻击的一些保护。您当前的解决方案是完全不安全的,因为它将salted散列本身作为密码。攻击者可以在不知道密码的情况下登录帐户


再说一次,不要发明你自己的东西。使用密码学家和整个社区设计和验证的协议。维基百科是你开始研究的好地方。布鲁斯·施奈尔(Bruce Schneier)的《应用密码学》(Applied Cryptography)一书是一本很好的资源,每个软件开发人员都应该在他们的库中拥有它。

客户端可以发送用户名和sha(密码),服务器可以进行转换和比较,而服务器不会为用户发送密码

这是一门关于密码学的好课程

https://class.coursera.org/crypto/class/index

确保散列的传输是用SSL加密的,因为如果散列被破坏,您的用户帐户就会被破坏


正如CodesInChaos的评论中所提到的,在SSL中验证服务器的公钥是非常重要的,而且是必要的,我不明白您所描述的内容

如果用户存在,服务器将为用户发送存储的盐

这里送什么?密码的哈希?

如果是,则没有安全性。其思想是,用户向客户端提供密码,客户端将加密的哈希发送到服务器进行比较。如果存在匹配项,则用户已通过身份验证,只要此交换通过SSL,就可以了。此外,如果您打算使用SHA-2族的成员,请使用SHA-512。今天,任何不足之处都是不可接受的

您描述的协议基本上是标准的用户/通行证网站登录+盐交换

更好的方法是在服务器上进行salt和SHA散列。让用户通过SSL以明文形式传输密码,并且永远不要泄露密码


是一个通过SSL的对等聊天客户端示例。

这对于数据库/服务器上的攻击不安全,实际上似乎无法达到使用salt哈希的目的。如果客户机发回一个盐渍散列来代替他们的密码,那么这与他们的密码基本相同

如果攻击者破坏了您的数据库,他们不必强行使用任何人的密码登录,他们只需使用salted散列,就可以成为任何他们想成为的人

如果您使用的是SSL,则可以通过加密的线路发送明文密码,并在服务器上进行散列。然后,攻击者必须强制执行哈希或攻击SSL通道


另外,使用PBKDF2、bcrypt或scrypt作为密码哈希算法,而不是SHA-2。您需要能够抵抗暴力攻击的东西。

很抱歉,您是否建议客户端以明文形式将密码发送到服务器?尤其是在什么可能是未加密的链接上!?为什么你会建议这样做?在客户端上对用户名+密码进行哈希处理原则上是合理的(请参见SRP),但OP的结构可能不是这样。如果在客户端(而不是浏览器)上下文中正确执行,SRP比向服务器发送用户名+密码更强大。因此,我不同意你的回答。@nikman,无论如何都需要加密链接(SSL)。这是在SSL之上运行的吗?您是否正在以某种方式验证服务器?如果没有这两个,这显然是不安全的。如果您使用salt发送一个nonce,并让客户端使用哈希密码+salt的HMAC进行响应,那么您至少可以避免重播攻击。这不是真正的加密问题,但如果用户存在,服务器会发送。。。这意味着我可以收集一个有效用户名列表,而不用费心尝试密码。我建议,如果您这样做,服务器会假装不存在的用户是有效的,并发送一个伪salt。@jbtule:密钥是一个nonce,而不是一个秘密。可以防止重播攻击,因为每次散列都会不同。@jbtule:我想这里不需要HMAC,普通的加密散列函数应该可以。您所做的只是将经过盐渍处理的散列密码添加到密码本身中。攻击者不在乎身份验证所需的令牌是原始密码“password123”还是salt哈希版本:“57893131-nkg48923nv8939563”。他们只需要发送到服务器进行身份验证。@NikBougalis:我不明白你的意思。这是任何用户/密码登录的标准方法。此外,它将通过ssl发送。你呢