我采取以下步骤在客户端和服务器之间发送/接收数据。但我不确定所有步骤是否足够安全且无法拦截。如果有的话,请你告诉我如何修补安全漏洞? 请注意:
第一次 - 注册(用户输入新用户名和新密码)
下次 - 登录(用户输入他的用户名和密码)
从用户向服务器发送TemperProof queryString
从服务器向用户发送回复
我认为以下几个方面存在缺陷。你能告诉我们如何解决这些问题并指出其他可能的漏洞吗?
由于
答案 0 :(得分:2)
如果您完全关心安全问题,请立即停止......
你需要做什么:
1)忘记设计自己的加密协议......依靠众所周知的加密ALSO意味着你不要设计那种东西
2)分层思考......你需要在将它们从A运输到B时保守秘密...这意味着你有一个传输层...如果你想要那个安全的,有一个名字那...
T ransport L ayer S ecurity - > https://en.wikipedia.org/wiki/Transport_Layer_Security
3)当你在这里做出类似假设时,我有2个应用程序,所以我不能有会话",请提供为什么你认为它是那样...当你想到像单点这样的东西 - 你可以让很多应用程序在一堆不同的平台上共享一种身份验证方法甚至会话数据...也许只是你不知道你实际上可以有会议......
4)阅读你使用的术语......你误解了熵......没有办法检查熵是否匹配" ...加密相关案例中的熵意味着对函数的不可预测输入的随机性...如果你有类似日期和时间的东西,即使你散列它,它可能看起来随机......但它是非常的具有时钟的人可以预测...如果通信可以与值的创建时间相关,那么如果基于时钟,则您的值不包含大量熵...再次,不设计您自己的这里的东西,去寻找提供可靠,加密安全随机性的熵源(CSPRNG ......不仅仅是PRNG)
5)...你误解/误用盐... 这在客户端机器上无需生成 这不需要保留在客户机上
7)密码哈希 再次......不要在这里想出你自己的东西...... 为每个密码创建一个足够长的随机盐(至少哈希长度)。使用具有高迭代计数参数的慢速哈希函数,如PBKDF2。原因是测试密码变得很慢......你的服务器必须为每次登录尝试计算一次......攻击者必须为每次密码测试尝试计算这个...你可以负担得起测试200ms ......对于攻击者而言,这意味着需要更多硬件才能破解密码存储......
<强> UPD:强>
你想要它,你得到它......
中间人对您的架构的概念证明:
客户:alice
服务器:bob
攻击者/窃听者:前夕
---协议破碎---
现在,bob绝不能在所有进一步的沟通中区分alice和eve
upd2:
查看您转移的(明文)消息:
登录:
将密码(明文的base64)和salt以及计算的哈希发布到服务器
从用户向服务器发送queryString:
将查询字符串(明文的base64),salt和entropy以及计算出的哈希值发布到服务器
答案:
将答案(明文的base64),盐,熵和计算的哈希发布到客户端
现在,对于任何这些消息,让我们看看有恶意的人会从中获取哪些信息:
所有信息都是明文,这意味着所有信息...... 对于登录,我们获得明文密码,意味着从现在起攻击者可以识别为有效用户
为查询字符串和答案提供了一种方法来查看请求/答案是否未得到缓和。
因此,如果攻击者现在拦截您的通信,他怎么能在不被注意的情况下更改查询字符串? 攻击者分裂你的消息,并改变他/她想要的任何东西 然后他/她将forged_hash计算为sha1(salt_from_the_original_message,tampered_querystring)并将base64(tampered_querystring),salt_from_the_original_message,entropy_from_original_message,forged_hash发送到服务器......
答案是同一笔交易:
攻击者截获原始答案,更改答案中的任何内容并根据已知信息(更改和原始盐)重新计算哈希值
答案 1 :(得分:0)
解决方案是使用HTTPS withTLS 1.2并固定证书,有免费的证书解决方案。
使用散列(在本例中为SHA1)来保护密码在一段时间内并不是一个好的安全措施。有关我的参考,请参阅DRAFT NIST Special Publication 800-63B Digital Authentication Guideline。
密码必须使用迭代的HMAC保护,而不是单个哈希。有关密码的更多信息,请参阅Jim Fenton的Toward Better Password Requirements,特别参见幻灯片23。这似乎与Pluralsight培训不一致,最佳实践随着时间的推移而发生变化。