我有一个SOAP服务,我用PHP 5.3.1的内置SoapClient调用。我必须对服务执行的第一个操作是自定义身份验证操作,我必须传递的一个必需参数是3DES加密字符串,我使用PHP的mcrypt创建,如下所示:
$encryptionKey = '1234myKey1234';
$currentFormattedDate = date ("Y/m/d H:i");
$encryptedString = mcrypt_encrypt('tripledes', $encryptionKey, $currentFormattedDate, 'ecb');
如果我试图通过$encryptedString
,因为我从mcrypt_encrypt()
得到它我在我身边发生致命错误而且没有打电话:
致命错误:SOAP-ERROR:编码:字符串'd \ xe0 ...'不是/ path / to / file中的有效utf-8字符串
但是如果我utf8_encode()
字符串是这样的话:
$encryptedString = utf8_encode($encryptedString)
然后进行了通话,但是他们的网络服务响应了以下错误:
格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:argStatusDate时出错。 InnerException消息是'反序列化System.String类型的对象时出错。字节0x19在此位置无效。第2行,第318位。'。
这是我在尝试了很多事情之后能够通过这个过程获得成功的最接近的事情。我已经确认我可以通过一个伪造的字符串,导致无法进行身份验证的预期响应。
我不认为这应该有任何区别,因为我认为SOAP调用最终是作为utf8制作的,但我尝试设置'encoding'=> 'PHP-8859-1'在PHP中构建我的SoapClient时,我得到了同样的错误。调用已完成但服务器响应反序列化错误。
有没有人知道更好的方法来处理这个加密的字符串,这将取悦我的PHP客户端和他们的.Net webservice?
也许问题就在他们的最后?
FWIW,我还可以要求我们根据他们的文档将加密方法更改为“Rijndael AES Block Cypher”。不确定这是否会导致更容易处理字符串。
答案 0 :(得分:1)
您可能需要在开始和结束标记内的基本64位编码CDATA段中对数据进行编码。您可能想要向服务的创建者询问样本,或者 - 如果是Web服务 - 尝试下载定义甚至创建客户端through discovery。请注意,最后一个链接是使用谷歌搜索找到的,我已经离开了PHP一段时间。
[EDIT]更改密码对此没有帮助,尽管有什么比ECB编码XML更好