首页 新闻 搜索 专区 学院

.NET如何调用基于Axis开发的Java的Web加密服务

0
悬赏园豆:10 [已解决问题] 解决于 2012-10-16 17:13

最近需要工作需要做一个代收接口,服务端是Java实现的,有认证机制。需要用.NET来调用,SOAP协议并不复杂,但.NET和JAVA实现起来是有区别的,直接用.NET封装的web servvice方法调用是不行的。要是怎么给username,password赋值?

面包快跑的主页 面包快跑 | 初学一级 | 园豆:189
提问于:2012-09-28 21:43
< >
分享
最佳答案
2

你可以用SoapUI来分析基于Java的 Web Service以及自动生成C#代理类。

如果自动生成的代理类无法正常工作,你需要通过分析得出服务采用的安全模式。

收获园豆:10
Launcher | 高人七级 |园豆:45045 | 2012-09-29 09:11

您好,AXIS2计算密码的算法是:Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) ) 。现在是.NET 去调用Java的Web Service,我这边是通过拼装Soap头的方式去请求的。但是返回提示一直是“无效的安全”。请问高手该怎么解决啊?

面包快跑 | 园豆:189 (初学一级) | 2012-10-08 17:43

@luoxiang: 如果只是加解密和签名的话,你需要注意字符串编码为字节时使用的是UTF-8、GB2312或者其它;其次,你需要考虑的是.NET的SHA-1的默认参数设置和JAVA的默认参数设置是不一样的,你应该使用正确的参数来使用SHA-1。

如果仅仅是上面的问题的话,那么是容易解决的,难就难在,对方的Web Service的安全机制是如何实现的,比如只是简单的SoapHeader传递凭据,还是有安全协商,这都需要具体的去了解。你可以通过抓包工具,或者SoapUI工具来分析具体的安全过程。

Launcher | 园豆:45045 (高人七级) | 2012-10-09 09:19

@luoxiang: 

            string password = "123456";
            string nonce = "DBE5190300FBF818F3454549285AB7C5";
            string created = "2012-10-08T11:21:06";

            // 设置正确的编码方式,一般应该显示指定为 UTF-8
            Encoding encoding = Encoding.GetEncoding("utf-8");
            byte[] dataToSign = encoding.GetBytes(nonce + created + password);

            SHA1 sha = new SHA1CryptoServiceProvider();

            // 为任意长度的数据生成 20 字节的数字摘要。
              byte[] signedData = sha.ComputeHash(dataToSign);
            
            // 转换为用 BASE64 编码的字符串,便于存储和传输。
              string passwordDigest = Convert.ToBase64String(signedData);
Launcher | 园豆:45045 (高人七级) | 2012-10-10 10:01

@luoxiang:我在一开始也提到了在不了解服务安全验证规则情况下,我是无法回答你的问题的。我只是回答了你的关于生成SHA1签名值的问题。

Encoding encoding = Encoding.GetEncoding("utf-8");
byte[] dataToSign = encoding.GetBytes(nonce + created + password);
从代码中你应该看到,SHA1只签名字节数组,和具体的字符串无关,也就是说,你提交给服务器的三个字符串,服务器将其转换成字节数组后一定要和你在客户端转换出来的字节数组一样。

其次,服务器有可能根据 nonce 和 created 来判断是否是有效的验证请求,nonce也有可能是由服务器生成的。这里有一篇简单的文章:http://devbbs.doit.com.cn/thread-966-1-1.html.

但是我不保证这篇文章描述的安全机制和你的服务器是采用的同一种方式。

Launcher | 园豆:45045 (高人七级) | 2012-10-10 15:02

@Launcher: 他的验证机制是:Nonce是本地随机生成的,服务器验证的时候获取我提交的Nonce、Created和Password(这是密码是我们协商好了的,比如:123456)。服务验证时候同样通过Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )算法,得到加密的密码和我提交生成的密码进行匹配。现在就是匹配不起。不知道Axis2的加密和NET的加密算法(SH1和Base64)有什么不一样的吗?请指教下。谢谢啦。第一次接触这些,还有就是我的思路是对的吧?

面包快跑 | 园豆:189 (初学一级) | 2012-10-10 15:59

@luoxiang: 根据你的描述,你认定了肯定是签名值不一样造成的安全验证失败,那么你为什么不把我回答的内容都去验证一次呢?我只好再跟你重复一遍,注意看下面代码:

Encoding encoding = Encoding.GetEncoding("utf-8");
byte[] dataToSign = encoding.GetBytes(nonce + created + password);

用于签名的是字节数组,不是字符串,字符串需要通过 Encoding 的方式转换为字节数组,为了知道在.NET和AXIS2中的SHA1哈希结果是否一致,那么你首先需要确定用于哈希的“字节数组(byte[] dataToSign)”是否一致。只有在需要哈希的字节数组一致时计算出的哈希值不一样,我们才能说在.NET和AXIS2中的SHA1算法实现的方式不一样。

Launcher | 园豆:45045 (高人七级) | 2012-10-10 17:01
其他回答(1)
0

用soapheader

nickycookie | 园豆:106 (初学一级) | 2012-09-28 23:04

@luoxiang: http://www.cnblogs.com/houleixx/archive/2009/08/22/WebService-SoapHeader-Security.html

支持(0) 反对(0) nickycookie | 园豆:106 (初学一级) | 2012-09-29 13:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册