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

2024-10-03 06:20:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个定制的程序,它需要在客户端和服务器之间进行经过身份验证/加密的通信(都是Python语言)。在

我们正在以一种非正统的方式从自定义编写的Diffie-Hellman+AES到RSA+AES进行全面检查。所以我对我的想法很感兴趣。在

前提条件:Klient有一个128位的注册密钥,在身份验证过程中它需要保持机密-这个密钥也是服务器和客户端之间唯一的共享机密。在

  1. 客户机通过不安全的通道与服务器联系,并询问服务器RSA PubKey
  2. 客户端然后查询服务器:
    [后面是伪代码]


       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)
三。然后服务器响应: [后面是伪代码] ^{pr2}$ 现在双方都知道“clientuuid”、“sharedkey”,客户机以后可以使用它来对自己进行身份验证。上面的方法应该是安全的,即使攻击者后来学习了regkey,因为他必须破解RSA密钥,中间人攻击(针对RSA)应该停止身份验证。无法正确完成。 我看到的唯一可能的攻击方法是攻击者知道regkey并可以在身份验证期间更改流量。我说的对吗?

我真的很想听听您的IDE,了解如何从这种方法中添加/删除什么,以及您是否知道一种更好的方法来进行这种交换。
PS!我们目前使用的是Diffie-Hellman(我自己的lib,所以可能有缺陷),我们已经尝试过使用PreSharedKeys的TLSv1.2(由于某些原因不起作用),我们被限制在http协议中,因为我们需要在django中这样做。因为我们在http中这样做,所以我们尽量保持请求/应答计数尽可能低(没有会话是最好的)-1将是最好的:)

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

所以,你们这些加密/安全极客,请帮帮我:)


Tags: 方法代码服务器身份验证客户端客户机密钥rsa
3条回答
  • 我不认为RegistrationKey能增加任何真正的安全性。在
  • 它需要更多的nonce(防止重播攻击)。在
  • 它需要更多的填充(否则消息很小,因此很容易解密)。在
  • 一个算法可以被证明是安全的。在
  • 密码的大多数缺陷都是在实现中,而不是在算法中(例如定时攻击)。在

不。使用SSL。重新发明密码系统是个坏主意。在

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

Apache Mod_Proxy

NginX as a Reverse Proxy

不要再发明风团,使用HTTPS。在

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

相关问题 更多 >