Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 通过HTTP(而不是HTTPS)对用户进行身份验证_Security_Cryptography_Public Key Encryption - Fatal编程技术网

Security 通过HTTP(而不是HTTPS)对用户进行身份验证

Security 通过HTTP(而不是HTTPS)对用户进行身份验证,security,cryptography,public-key-encryption,Security,Cryptography,Public Key Encryption,初始注释:这只是一个个人修补项目;我不是在这里写企业安全,如果是的话,我知道最好不要写我自己的方案-D 编辑:为了强调上述观点,我尝试将其标记在“IknowThisWouldbadeainRealLife”下,但因此不接受,因为它大于25个字符。请注意,我知道这不是商业级的 我需要一种通过HTTP对用户进行身份验证的方法(在这种情况下不能使用HTTPS)。我需要知道另一端的人真的是他们所说的那个人(在某种相当高的信心程度上)。一旦我确定用户是合法的,我就不在乎客户端和服务器之间的内容是否以明文形

初始注释:这只是一个个人修补项目;我不是在这里写企业安全,如果是的话,我知道最好不要写我自己的方案-D

编辑:为了强调上述观点,我尝试将其标记在“IknowThisWouldbadeainRealLife”下,但因此不接受,因为它大于25个字符。请注意,我知道这不是商业级的

我需要一种通过HTTP对用户进行身份验证的方法(在这种情况下不能使用HTTPS)。我需要知道另一端的人真的是他们所说的那个人(在某种相当高的信心程度上)。一旦我确定用户是合法的,我就不在乎客户端和服务器之间的内容是否以明文形式发送

我看到的问题是,试图将密码从客户端发送到服务器,而不是以明文形式发送。我曾经考虑过在javascript中尝试一些公钥加密,因为一些谷歌搜索发现了一些有趣的库

以下是我正在考虑的方案:

(假设AA'分别表示私钥和公钥;enc(text,key)dec(cyphertext,key)表示加密/解密函数)

+------------------------+------------------------------+
|服务器|客户端|
+------------------------+------------------------------+
(1) | t=randomToken()|
(2) |附录(t,A)--->c|
(3) | | A'=getKeyFromUser()|
(4) | p您可以使用。大多数浏览器、服务器和各种库都已经支持这一点

编辑:

如果您真的想在没有SSL/TLS的情况下使用公钥加密,您可以看看

如果你真的想发明你自己的身份验证方案,你应该注意你的标签上的加密/解密错误(不确定这是否是打字错误,或者可能我没有正确阅读图表,看起来你在服务器端做enc(t,a):

  • 您可以使用公钥进行加密
  • 您可以使用私钥进行解密
  • 您使用私钥进行签名
  • 您可以使用公钥验证签名

在您的方案中,您需要服务器发布其公钥,并让客户端使用该公钥加密其答案,然后将其发送到服务器,然后服务器将能够使用其私钥对其进行解密。然后,难点在于确保公钥确实是合法服务器的公钥,并且它没有被中间的攻击者截获和替换:这就是PKI和证书与TLS(和HTTPS)一起起作用的地方。

您基本上想要在HTTP上实现SSL;这在某种程度上是可行的,但永远不会像真实的东西那么好

能够来回发送加密数据只是问题的一半。问题的另一部分是确保你实际上是在与服务器对话(想想中间人的攻击)。 我不确定SSL是如何工作的,但这是一条路要走。你应该好好读一读。然而,从你的计划看来,这似乎毫无意义。为什么要将明文发送回服务器?这违背了设立这一机构的目的

我会这样做:

  • 服务器向客户端发送一个随机令牌。服务器将令牌存储在“挂起”列表中。可在一定时间间隔内(例如:每15分钟)清除一次
  • 客户端将
    enc(comb(用户名、密码、令牌)、公钥)
    发送回服务器,其中
    comb()
    是一个结合用户名、密码和随机令牌的函数
  • 服务器使用
    decomb(dec(message,privKey))
    返回用户名和密码,其中
    decomb()
    comb()相反
    
  • 服务器检查令牌是否存在于挂起列表中。如果不是,请拒绝登录尝试。如果是,it服务器可以像往常一样继续执行身份验证

  • 如果生成的令牌从未重复,攻击者就不能重新发送相同的加密消息,也不能解密消息以查明所有内容。

    假设您的客户端和服务器在此交换开始之前交换公钥,您可以执行以下操作:

  • 客户机发送HTTP请求,请求头包含用户名和加密(私钥、用户+URL)
  • 服务器尝试使用指定用户的公钥解密标头的内容
  • 如果解密失败,或者包含的用户或URL不匹配,则请求将被拒绝
  • 包含URL是为了防止针对不同资源的重播攻击。通过在加密数据中包含时间戳,可以获得更高的重播安全性

    如果您使用高质量的加密方案,那么已知的明文攻击就不是一个大问题


    编辑:删除了对AES128的提及。

    就像布鲁诺说的那样,你所描述的内容符合HTTP摘要的内容,这是非常安全的。但是,如果你仔细阅读,就会发现有一些环洞。不大。有人真的需要倾听,等待拿起握手中的钥匙才能破门而入。如果安全性是一个问题,您必须使用https并为其让路。这就是它存在的原因。https具有证书,可以使握手在一开始就抵抗窃听者。

    首先,https的作用不仅仅是加密。它还可以防止活动的MTIM攻击并保护您的会话id。如果您只是泄漏会话id,则密码毫无意义。这是OWASP A9的一部分

    然而,有人已经实现了一种新的方法。它对会话id和密码进行加密。它使用Diffie-Hellman密钥交换,类似于SSL。即使
        +------------------------+------------------------------+
        |         SERVER         |            CLIENT            |
        +------------------------+------------------------------+
    (1) | t = randomToken()      |                              |
    (2) | enc(t, A)           -------->  c                      |
    (3) |                        |       A' = getKeyFromUser()  |
    (4) | p                 <--------    p=dec(c, A')           |
    (5) | if (t==p)              |                              |
        |     allowAccess()      |                              |
        | else                   |                              |
        |     denyAccess()       |                              |
        +------------------------+------------------------------+