0

我在不安全的网络上有一个需要授权的 Web 服务。

我希望通过 HTTP 而不是 HTTPS 来实现它,同时避免中间人攻击和嗅探攻击。我只需要一个用于客户端和服务器的密钥。

客户端调用一个服务端函数,服务端可以验证这个客户端是否正确,并且可以返回一个响应,这个响应需要签名而不是加密。

我对如何实现这一点有一个粗略的想法,并举个例子:

Pseudocode
Web service and client has already shared PASSCODE1 and PASSCODE2

First Handshake:
Client pings web service
Web service sends random string A with length 
Client checks A is nonnull, and sends Hash X=(md5(A XOR PASSCODE1) XOR 
    concat("RIGHT",random string B) XOR PASSCODE2)
Web service receives Hash X, checks if "RIGHT" is there, saves  key B, sends 
    Hash Y=(md5(B XOR PASSCODE1) XOR concat ("RIGHT", random string C) 
        XOR PASSCODE2)
Client checks if this value is right, and they are authenticated
At this point, if everything goes right, have keys B and C for this 
    particular transaction

Sample Transaction:
Client calls function(args, md5(args, C) XOR PASSCODE2)
Server returns (object(), md5(args, B) XOR PASSCODE2)

keys expire after a few minutes, and a new key pair needs to be requested

我知道这种方法很粗暴,还有其他方法吗?

具体来说,我希望在 Java 中做到这一点。

4

2 回答 2

3

一般来说,您不应该自己这样做。根据您使用的平台,很可能有一个可用的框架来实现WS-Security 规范

该规范涵盖了消息完整性以及使用 X.509 证书使用纯文本(换句话说,通过 HTTP)的消息加密。

但是,重要的是保护用于签名的证书,因为如果证书公开,您将无法避免中间人攻击。

Google 中搜索“java WS-security”这个术语会发现一些关于如何在 Java 中实现 WS-Security 规范的资源。

但是,您可能希望查看Web Services Developers Pack,因为它在框架中似乎更加标准化。

于 2010-02-27T06:35:39.767 回答
1

正如其他人评论的那样,SSL 是实现它的方法。自己动手是弄错的秘诀。

如果您设计自己的哈希和加密算法组合,并且您不是密码专家,那么您几乎可以保证提出可利用的东西。当然,你是否足够关心是另一回事。也许您只是想防御那些不会努力利用您方法中的弱点的临时攻击者。

一种方法可能是通过纯 HTTP 交换 S/MIME 内容。至少那时你坚持一个既定的机制。

于 2010-02-27T07:28:40.520 回答