php - 在 PHP SOAP SERVER 中验证 WS-security 密码摘要
问题描述
我需要在 PHP-Soap webservice 上实现 WS-Security 密码摘要。我到处寻找如何做到这一点,但我一无所获。通过反复试验,我发现 PHP Soap 服务器将调用在 Service 类中实现的“安全”函数,将在其中执行验证。现在我的函数看起来像这样:
public function Security($UsernameToken)
{
$this->log($UsernameToken);
$loggHelper = [];
$loggHelper['nonce'] = unpack('H*', base64_decode($UsernameToken->Nonce))[1];
$loggHelper['created'] = pack('a*', $UsernameToken->Created);
$loggHelper['password'] = pack('a*', 'test');
$loggHelper['passhash1'] = base64_encode(pack('H*',sha1($loggHelper['nonce'].$UsernameToken->Created.$loggHelper['password'])));
$this->log($loggHelper);
if($UsernameToken->Password==$loggHelper['passhash1'])
return true;
else
{
return new SoapFault("401", "Prohibited");
}
}
问题是,我的摘要与测试客户端(SoapUI)提供的密码不同
日志输出如下所示:
$UsernameToken = {"Username":"test","Password":"HMxOK\/pg3mOq71N2F5Znb7xDdcw=","Nonce":"BgbT8vrQb\/afX7OC3KPb0Q==","Created":"2020-06-24T07:31:11.731Z"}
$loggerHelper = {"nonce":"0606d3f2fad06ff69f5fb382dca3dbd1","created":"2020-06-24T07:31:11.731Z","password":"test","passhash1":"gJGXpD3yYDmLY6qMhRtKYWr33IA="}
解决方案
先说几点:
- 出于安全原因,您不应记录任何凭据 - 能够访问日志文件的每个人都可以访问凭据!
- SHA1 根本不是一种安全加密算法 - 请参阅https://crypto.stackexchange.com/questions/48289/how-secure-is-sha1-what-are-the-chances-of-a-real-exploit
我建议使用
用于加密,它包含在 PHP 本身中。
或者您使用一个框架来处理引擎盖下的安全性。作为一个例子(但我不确定)symfony 应该自动为你做这件事 - 请在https://symfony.com/doc/current/controller/soap_web_service.html阅读更多内容
推荐阅读
- php - PHP:使用套接字身份验证连接到 MySQL
- mysql - 如何增强 JavaFx-MySQL 应用程序的性能
- angular - 中途停止加载组件
- javascript - v-html 的样式在 vue.js 上覆盖了整个应用的样式
- r - 使用前一个方位的 destPoint 查找方位
- rendering - 无法在 3D 场景中引入粒子系统
- c# - 无法在 JetBrains Rider 的物理 iOS 设备上部署 Xamarin 应用程序
- javascript - 我怎样才能使这个 ajax 代码适用于任何类型的 html 文件
- javascript - 如何创建动态字典和添加-删除键值对?
- google-sheets - 尽管验证成功,但 Google Oauth Unverified 错误