我希望在我的网站上为用户登录功能构建一个私有数据传输和保护方案 . 我希望保护的私有数据是用户ID和密码 .
我对此方案的要求包括:安全数据传输(无SSL,TCL),高度安全的存储(一旦丢失密码,数据就变得无法恢复)
我已经起草了下面列出的一个:
-
RSA(分别在客户端和服务器站点上加密和解密)详细地说,我计划使用Javascript加密客户端站点上的用户ID和密码,并使用PHP生成私钥和公钥并解密服务器站点上收到的密文 .
-
SHA256 / SHA512 /两次MD5(在服务器站点上,使用随机Salt加密,使用用户ID进行加标)使用PHP通过SHA256算法使用用户ID绑定盐重新加密普通密码 .
这是满足我要求的好方法吗?谢谢
2 回答
确保密码无法被拦截的最佳方法是不传输密码:这比人们想象的容易得多:
在服务器端,存储盐渍和散列的passowrds(有关如何正确执行此操作的数千篇文章)
当客户端上的用户登录时,他输入用户名和密码
使用用户名,从服务器请求salt(例如通过AJAX) . 这不是安全问题,因为盐不是秘密 . 在同一回复中发送服务器时间戳 .
在客户端创建盐渍哈希,这会产生一个双方都知道的秘密,即使它从未穿过线路 . 收下 .
使用服务器时间戳和客户端本地时间来计算时间偏移并保留它 - 您将需要它来避免重放攻击 .
您现在可以使用此秘密(盐渍密码哈希)和时间戳来安全地传输您想要的任何内容:对于请求,将passhash加上(偏移校正的)时间戳和一些熵,再次哈希 . 使用此密钥加密(AES会想到)您的消息到服务器,发送时间戳和随机盐
在服务器上拒绝超过几秒钟的重放安全时间戳
在服务器上使用提供时间戳和salt来重新创建此消息的密钥
Crypto-js有你需要的JS部件
对我们来说是一个坏消息:( RSA 1024位在100小时内被破解!这是文章:
1024-bit RSA encryption cracked by carefully starving CPU of electricity