我正在制作一个有趣的聊天程序,我决定加入加密。但是,我是新手,所以我想知道的是,这是加密安全的,这是一个很好的做事方式吗?
这是登录:
开始:
客户端发送用户名
如果用户存在,服务器将为用户
发送存储的salt然后客户端发送SHA-2散列(Salt +明文密码)
服务器将它与存储的salt +密码的散列结果进行比较,如果它相同则用户已经成功登录,并且从那里加密就是AES。
结束
有任何缺陷吗?我不认为有,但我不愿意继续使程序只被告知加密不起作用!此外,任何人都有进一步阅读密码学的良好链接?
答案 0 :(得分:3)
这对攻击您的数据库/服务器是不安全的,实际上似乎无法使用盐渍哈希的目的。如果客户端发回盐渍哈希代替他们的密码,那么这与他们的密码基本相同。
如果攻击者破坏了您的数据库,他们就不必强行使用任何人的密码登录,他们只是使用盐渍哈希,他们可以是他们想要的任何人。
如果您使用的是SSL,则可以通过加密线路发送明文密码,并在服务器上进行哈希处理。然后攻击者必须暴力破解哈希或攻击SSL通道。
另外,使用PBKDF2,bcrypt或scrypt作为密码哈希算法,而不是SHA-2。你想要一些抵抗暴力攻击的东西。
答案 1 :(得分:2)
确保使用SSL加密哈希的传输,因为如果哈希受到威胁,您的用户帐户就会受到损害。
正如CodesInChaos的评论所述,在SSL中验证服务器的公钥是重要和必要。
答案 2 :(得分:1)
简短的回答是“不,为什么反正会有机会?”而答案太长且涉及太长。有太多的变量未知我们给出一个好答案:客户端和服务器之间的链接是否加密?您是否验证要连接的服务器的身份?等
一般来说,你不应该重新发明轮子,你应该避免自制的密码学。对于密码,考虑使用scrypt并感到高兴。
如果要验证用户输入的密码,您可能还需要考虑实施质询 - 响应身份验证系统,或至少实施一些防止重放攻击的保护。您当前的解决方案是完全不安全的,因为它使盐渍哈希本身成为密码。抓住它的攻击者可以在不知道密码的情况下登录该帐户。
再次,不要发明自己的东西。使用由密码学家和整个社区设计和验证的协议。维基百科是开展研究的好地方。 Bruce Schneier撰写的“Applied Cryptography”一书是伟大的资源,每个软件开发人员都应该在他们的库中拥有它。
答案 3 :(得分:1)
只要此交换是通过SSL,它应该没问题。此外,如果您已开始使用SHA-2系列的成员,请使用SHA-512。今天更少的东西是不可接受的。
您描述的协议基本上是标准的用户/通过网站登录+盐交换。
更好的方法是在服务器上进行salting和SHA散列。让用户通过SSL以纯文本方式传输密码,永远不会透露盐。
JChatd是SSL上的示例点对点聊天客户端。
答案 4 :(得分:0)
客户端可以发送,用户名和sha(密码),服务器可以进行转换和比较,服务器不会为用户发送盐
这里是关于密码学的好课程
https://class.coursera.org/crypto/class/index
答案 5 :(得分:0)
我不明白你的描述
如果用户存在,服务器将为用户发送存储的盐
这里发送什么?密码的哈希?
如果是,则没有安全性。这个想法是用户向客户端提供密码,客户端将加密的哈希值发送到服务器进行比较。如果匹配,则用户已经过身份验证