我们有一个自定义构建的程序,需要在客户端和服务器之间进行身份验证/加密通信[在Python中]。
我们正在以非正统的方式从自定义编写的Diffie-Hellman + AES到RSA + AES进行大修。所以我对我的想法的评论非常感兴趣。
先决条件:Klient有一个128位的RegistrationKey,在验证过程中需要保密 - 这个密钥也是服务器和客户端之间唯一的共享密钥。
RegistrationKey = "1dbe665ac7a944beb67f106f779e890b"
clientname = "foobar"
randomkey = random(bits=128)
rsa_cp = RSA(key=pubkey, data=randomkey+clientname)
aes_cp = AES(key=RegistrationKey, data=RegistrationKey+rsa_cp)
send(aes_cp)
3.然后服务器响应:
[伪代码如下]
# Server decrypts the data and sees if it has a valid RegistrationKey, if it does...
clientuuid = random(bits=128)
sharedkey = random(bits=128)
rsa_cp = RSA(key=privkey, data=clientuuid+sharedkey)
aes_cp = AES(key=randomkey[got from client], data= rsa_cp)
send(aes_cp)
现在双方都知道“clientuuid”,“sharedkey”,客户可以稍后使用它来验证自己。上述方法应该是安全的,即使攻击者以后学习了regkey,因为他必须破解RSA密钥而且中间人攻击(在RSA上)应该停止auth。从正确完成。
我看到的唯一可能的攻击方法是攻击者知道regkey并且可以在身份验证期间改变流量。我是对的吗?
我真的很想听听你在这种方法中添加/删除的内容以及如果你知道更好的方式进行这种交换。 PS!我们目前正在使用Diffie-Hellman(我自己的lib,所以它可能有缺陷)我们已经尝试使用PreSharedKeys的TLSv1.2(由于某种原因没有工作)而且我们对http协议很有用,因为我们需要在Django的。因为我们在http中这样做,我们尽量保持请求/答案数量尽可能低(没有会话是最好的) - 1将是最好的:)
如果您对具体细节有任何疑问,请询问。
所以,你加密/安全极客,请给我一个帮助:)
答案 0 :(得分:4)
不要重新发明风团,使用HTTPS。
服务器可以向客户端颁发证书并将其存储在数据库中。可以使用服务器的自签名证书分发客户端以进行验证。服务器可以使用Apache's HTTPS Environment Variables验证客户端。
答案 1 :(得分:3)
没有。使用SSL。重塑密码系统是一个坏主意。
您可以轻松完成的是设置反向代理。在更高端口(例如,8080)上运行Django应用程序并将其设置为仅响应来自环回地址(127.0.0.1)的连接。在端口443(标准HTTPS端口)上运行反向代理,并代理对Django应用程序的所有请求。但是使用站点的证书设置反向代理并使其成为SSL端点。转到Django应用程序的代理请求只是“常规旧”HTTP,而不是HTTPS。
答案 2 :(得分:1)