自定义系统中基于HTTP的身份验证/加密协议

时间:2010-07-08 15:38:05

标签: python security authentication encryption cryptography

我们有一个自定义构建的程序,需要在客户端和服务器之间进行身份验证/加密通信[在Python中]。

我们正在以非正统的方式从自定义编写的Diffie-Hellman + AES到RSA + AES进行大修。所以我对我的想法的评论非常感兴趣。

先决条件:Klient有一个128位的RegistrationKey,在验证过程中需要保密 - 这个密钥也是服务器和客户端之间唯一的共享密钥。

  1. 客户端通过不安全的通道联系服务器并询问服务器RSA PubKey
  2. 客户端然后查询服务器:
    [伪代码遵循]
  3. 
           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将是最好的:)

    如果您对具体细节有任何疑问,请询问。

    所以,你加密/安全极客,请给我一个帮助:)

3 个答案:

答案 0 :(得分:4)

不要重新发明风团,使用HTTPS。

服务器可以向客户端颁发证书并将其存储在数据库中。可以使用服务器的自签名证书分发客户端以进行验证。服务器可以使用Apache's HTTPS Environment Variables验证客户端。

答案 1 :(得分:3)

没有。使用SSL。重塑密码系统是一个坏主意。

您可以轻松完成的是设置反向代理。在更高端口(例如,8080)上运行Django应用程序并将其设置为仅响应来自环回地址(127.0.0.1)的连接。在端口443(标准HTTPS端口)上运行反向代理,并代理对Django应用程序的所有请求。但是使用站点的证书设置反向代理并使其成为SSL端点。转到Django应用程序的代理请求只是“常规旧”HTTP,而不是HTTPS。

Apache Mod_Proxy

NginX as a Reverse Proxy

答案 2 :(得分:1)

  • 我认为RegistrationKey不会增加真正的安全性。
  • 需要更多的随机数(针对重播攻击)。
  • 它需要更多填充(否则消息很小,因此很容易解密)。
  • 算法可以证明是安全的,您可能希望这样做。
  • 加密中的大多数缺陷都在实现中,而不是在算法中(例如,定时攻击)。