请推荐一种在Java中通过HTTP授权纯文本事务的方法?

时间:2010-02-27 06:28:15

标签: java http security signing

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

我希望通过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做到这一点。

2 个答案:

答案 0 :(得分:3)

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

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

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

Google search for the terms "java WS-security"会在how to implement the WS-Security specification in Java上显示一些资源。

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

答案 1 :(得分:1)

正如其他人所评论的那样,SSL就是这样做的。滚动你自己是一个错误的方法。

如果您设计自己的散列和加密算法组合,并且您不是一个热门的密码学家,那么您几乎可以保证能够获得可利用的东西。当然,你是否足够关心是另一回事。也许你只是试图抵御那些不会在你的方法中利用弱点的偶然攻击者。

一种方法可能是通过普通HTTP交换S / MIME内容。至少那你坚持已建立的机制。