Security 一种认证算法的安全性

Security 一种认证算法的安全性,security,encryption,cryptography,aes,Security,Encryption,Cryptography,Aes,我正在用python编写一个小脚本,其中客户端必须向服务器进行身份验证。其思想是,攻击者在不知道密码的情况下,无法通过监听网络对自己进行身份验证。 尽管有任何良好的实践,我还是在尝试自己的安全身份验证(它只供个人使用) 在我当前的算法中,客户端和服务器共享: 验证客户端的密码 加密密钥 加密算法(带pycrypto的AES) 其工作原理如下: 服务器生成一个令牌 服务器对令牌进行加密 加密的令牌被发送到客户端 客户端解密令牌 客户端加密集合(密码+令牌) 将加密集(密码+令牌)发送到服务器

我正在用python编写一个小脚本,其中客户端必须向服务器进行身份验证。其思想是,攻击者在不知道密码的情况下,无法通过监听网络对自己进行身份验证。 尽管有任何良好的实践,我还是在尝试自己的安全身份验证(它只供个人使用)

在我当前的算法中,客户端和服务器共享:

  • 验证客户端的密码
  • 加密密钥
  • 加密算法(带pycrypto的AES)
其工作原理如下:

  • 服务器生成一个令牌
  • 服务器对令牌进行加密
  • 加密的令牌被发送到客户端
  • 客户端解密令牌
  • 客户端加密集合(密码+令牌)
  • 将加密集(密码+令牌)发送到服务器
  • 服务器解密(密码+令牌)
  • 如果接收到的信息对应于共享密码和服务器发送的令牌,则客户端将成功通过身份验证
在该算法中,客户端和服务器共享两个秘密:密码和加密密钥

我想知道这样做是否安全:

  • 服务器生成一个令牌
  • 服务器将令牌发送到客户端(纯文本)
  • 客户端加密令牌,并将其返回给服务器
  • 如果解密的令牌正确,则客户端将成功进行身份验证
在这种情况下,服务器和客户端只共享一个秘密(加密密钥)。根据我对AES的(少量)了解,我认为攻击者不应该能够通过令牌和加密令牌猜测密钥,也不应该在不拥有密钥的情况下猜测加密令牌

所以我的问题是:你看到我的算法有什么缺陷吗?第二个和第一个一样安全吗

感谢您的帮助

我不是密码专家(大声呼喊),但AES旨在确保机密性,您的方法不会阻止不可抵赖性。换句话说,我无法读取令牌的内容,但我可以截获您的消息并将相同的消息发送到服务器以“验证”我自己,对吗?(另外)中间的人可以修改您的消息并潜在地引起问题,因为AES再次保证了消息的机密性,但不完整。除了这些核心问题之外,在实现此功能时,您可能会犯一些微妙的错误,这些错误可能会导致您(和我)很难检测到的问题,但攻击者可能会发现这些问题

也许当与an结合时,您可以克服这些弱点。。。但我必须鼓励您不要“使用您自己的”加密方案,也许您所需要的只是HTTPS来保护两个设备之间的通信(以及一个预共享的令牌/密钥/密码来证明身份)。如果您决定继续沿着这条路线走下去,我也会鼓励您进行重要的研究,并在任何类型的生产环境中使用之前,请安全专家审查您的代码/实现。如果这只是为了好玩/研究,那就另当别论了

我不是密码专家(大声呼喊),但AES是为了确保机密性,而您的方法不会阻止不可抵赖性。换句话说,我无法读取令牌的内容,但我可以截获您的消息并将相同的消息发送到服务器以“验证”我自己,对吗?(另外)中间的人可以修改您的消息并潜在地引起问题,因为AES再次保证了消息的机密性,但不完整。除了这些核心问题之外,在实现此功能时,您可能会犯一些微妙的错误,这些错误可能会导致您(和我)很难检测到的问题,但攻击者可能会发现这些问题


也许当与an结合时,您可以克服这些弱点。。。但我必须鼓励您不要“使用您自己的”加密方案,也许您所需要的只是HTTPS来保护两个设备之间的通信(以及一个预共享的令牌/密钥/密码来证明身份)。如果您决定继续沿着这条路线走下去,我也会鼓励您进行重要的研究,并在任何类型的生产环境中使用之前,请安全专家审查您的代码/实现。如果这只是为了好玩/研究,那就另当别论了

我认为这个实现并不容易受到重播攻击,因为令牌是为每个连接随机生成的。要重放攻击,攻击者应监听令牌,监听加密响应,并多次连接到服务器,以期再次生成他知道的令牌。关于完整性,在发生MITM攻击的情况下,最糟糕的情况是停止或修改响应,这将导致服务器无法识别客户端,因此无法执行命令。我的情况不是很严重,为了简单起见,我只想从我的计算机上触发服务器上的一些bash命令,而不必通过SSH连接。我想到了一个Python脚本,它在服务器端侦听,并在客户端(我的计算机)连接时触发这些命令。这个小小的“加密方案”就是为了防止任何连接(例如端口扫描程序或攻击者)触发这些命令。必须有更高效、更安全的方法来实现我的目标(无需通过SSH连接即可远程触发脚本),我很乐意就此主题获得一些建议。SSH很棒,为什么不使用SSH进行基于密钥的身份验证呢?(这样可以避免“键入”密码)。@Aeinot Gray是对的。。即使您的方案在第一眼看上去是有效的,但如果没有正确地实现,它确实可能会出错(这就是为什么推出自己的协议不是最好的主意)。使用经过战斗验证的东西(ssh,