我有一个PHP的Web服务构建,它使用UsernameToken作为身份验证机制.我有PHP客户端代码可以访问此Web服务.现在我需要用Java做到这一点.也许你可以帮助我!
可以使用以下php代码访问此服务:
$password="super_secure_pass";
$timestamp=gmdate('Y-m-d\TH:i:s\Z');
$nonce=mt_rand();
$passdigest=base64_encode(pack('H*',sha1(pack('H*',$nonce).pack('a*',$timestamp).pack('a*',$password))));
$nonce=base64_encode(pack('H*',$nonce))
Run Code Online (Sandbox Code Playgroud)
这些值被解析为此Soap头.
<wsse:Security SOAP-ENV:mustUnderstand="0" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>'.$username.'</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">'.$passdigest.'</wsse:Password>
<wsse:Nonce>'.$nonce.'</wsse:Nonce>
<wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">'.$timestamp.'</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
Run Code Online (Sandbox Code Playgroud)
使用此代码,我可以毫无问题地访问Web服务.现在我需要用Java做到这一点.
我创建了必要的文件,实现了一个处理程序来添加一个带有UsernameToken的soap标头.但是当我尝试访问WS时,我总是收到"Not Authorized"错误.我认为在创建passdigest或nonce条目时我遗漏了一些东西.
以下是我如何计算它们:
Random generator = new Random();
String nonceString = String.valueOf(generator.nextInt(999999999));
String createTime=localToGmtTimestamp();//Returns a date with format (SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"))
String pass="super_secure_pass";
String tmp = AeSimpleSHA1.SHA1(nonce + createTime + pass);
encodedPass = Base64.encodeBytes(tmp.getBytes());
Run Code Online (Sandbox Code Playgroud)
创建soap标头时将使用这些值:
SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
SOAPHeader header = envelope.addHeader();
SOAPElement security = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse");
SOAPElement username = usernameToken.addChildElement("Username", "wsse");
username.addTextNode(user);
SOAPElement …
Run Code Online (Sandbox Code Playgroud) 我有一个网络应用程序,用户验证他们的flickr api.它使用OAuth 1.0,大多数时候身份验证都可以使用.但是在随机时间,在完全随机的时间,flickr无法识别我的签名.它在请求请求令牌时返回无效的签名错误.但是下一次尝试中的相同代码会正确地返回请求令牌.
我怀疑它与我生成随机数或时间戳的方式有关.否则它不应该在连续的尝试中工作,对吗?
这是我生成随机数和时间戳值的方法:
$nonce = md5(microtime(true).rand());
$timestamp = mktime();
Run Code Online (Sandbox Code Playgroud)
这有什么问题吗?有没有更好的方法来生成nonce值?这种随机故障非常混乱.我无法想到为什么我会得到一个无效的错误,随机!
跟进
根据Jan Gerlinger的建议,我将mktime()更改为time().它肯定减少了发生的频率.但是它仍然会在随机时间给出无效的签名错误,很少在更改为time()之后,我可能会添加.
所以,我假设时间戳(mktime)是导致这些随机错误的问题之一.但那里还有其他一些问题.也许在nonce一代?
我试图使用UUID生成作为一个nonce用于Twitter反向身份验证.但显然UUID不是一个好选择.那么我怎样才能在每次删除所有非单词字符时生成一个唯一的随机字符串,注意它在使用后会从内存中释放出来.以下代码崩溃.
var uuid: CFUUIDRef = CFUUIDCreate(nil)
var nonce: CFStringRef = CFUUIDCreateString(nil, uuid)
CFRelease(uuid)
println("createdNonce:\(nonce)")
Run Code Online (Sandbox Code Playgroud)
编辑: 我在xcode6 beta2,我无法调试,xocde崩溃,任何机会它.好吧,CFRelease部分对我来说很糟糕.一旦我删除,它似乎工作正常,但我不知道这是否会造成内存泄漏.
至于为什么UUID可能不是用于nonce的好选择,似乎是因为UUID不是由真正的随机位组成,请参考这里的讨论:https://github.com/aws/aws-sdk-ios/issues/30
我究竟做错了什么?由于某种原因,CSP 无论如何都会阻止 js 文件调用,即使我在 attr 中指定了随机数 ID。
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-Xiojd98a8jd3s9kFiDi29Uijwdu';">
</head>
Run Code Online (Sandbox Code Playgroud)
通话功能:
jQuery.loadScript = function (url, callback) {
jQuery.ajax({
url: url,
dataType: 'script',
success: callback,
async: true,
scriptAttrs: { nonce: "Xiojd98a8jd3s9kFiDi29Uijwdu" }
});
}
$.loadScript("/js/temp.js");
Run Code Online (Sandbox Code Playgroud)
错误信息:
拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'nonce-Xiojd98a8jd3s9kFiDi29Uijwdu'”。启用内联执行需要“unsafe-inline”关键字、哈希值(“sha256-9pSu4Q2RG6fzg6RdmNxg1z3W+Y9EdC0f90RGYsLO/o4=”)或随机数(“nonce-...”)。
Jquery 版本:
/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
编辑:如果我不使用$.loadScript
函数,所有安装了nonce attr的js文件都可以正常工作。问题出在js文件的动态调用上,但不幸的是我无法摆脱它。并且需要动态加载。
编辑(2):我尝试通过 document.createElement ("script"),也通过 jQuery.globalEval 并在各处添加随机数。输出结果表明某些函数(其中一个使用 foreach)无法运行并出现错误:Refused to execute inline event handler because it violates the following Content Security Policy directive: …
Angular文档提到了 CSP,Google 的安全工程师建议不要使用白名单。我还没有弄清楚如何将随机数注入到 Angular 注入到 index.html 的脚本标签中(以“引导”本身)。我想这与 Webpack 有关,但ng eject
我相信该命令不久前已从 cli 中删除,并且我无法找到有关此的教程。有人可以帮我开始指点吗?
Webpack文档提到了一个变量
__webpack_nonce__ = 'let-nonce-string-be-injected-by-server-here';
Run Code Online (Sandbox Code Playgroud)
需要在入口文件中进行定义(不是配置 - 所以@angular-builders/custom-webpack npm 模块可能不会有帮助?),但我不清楚 Webpack 的入口文件在 Angular 的上下文中是什么...?
PS:从这篇博文来看,polyfill 文件是入口文件之一 - 但看起来它不是第一个,所以我怀疑在那里添加变量是否有效......?
我最近一直在阅读 CSP 的内容,但我未能找到关于 nonce 如何工作的清晰解释或可靠示例。unsafe-inline
出于安全考虑,我试图避免使用。
到目前为止,我的理解如下:
服务器每次连接都会生成一个新的随机数客户端通过某种方式获取这个随机数并将这个字符串插入到每个脚本标签中
但是,我不知道客户端如何获得这个在每个连接中都是动态且唯一的值。某种方式是什么样的?我应该实现一个额外的 API 来获取这个值吗?
我使用了 React.js,并且我的 HTML 头中有一个Google 跟踪代码管理器片段,如果有人可以提供与这些相关的示例,那就完美了。
http-headers nonce content-security-policy google-tag-manager reactjs
我有一个应该是安全的应用程序,因此使用了Nonce,但是我无法使它们正常工作。我尝试了几种方法,但由于验证不起作用,显然缺少了一些内容。
我的js代码片段是:
function placeNew(next){
_nonce = $('input#_nonce').val();
request = $.ajax({
type: 'POST',
url: url_path + '/foo/v1/newbee',
data: {bid : next , _nonce : _nonce},
security: '<?php echo wp_create_nonce( "a" ); ?>',
dataType: 'json'
});
request.done(function (response, textStatus, jqXHR){
str = JSON.stringify(response);
if(response["error"]){
alert(response["message"]);
}
Run Code Online (Sandbox Code Playgroud)
使用以下代码将现时值添加到页面:
$nonce = wp_create_nonce( 'a' );
echo "<input type='hidden' id='_nonce' value=" . $nonce ."/>";
Run Code Online (Sandbox Code Playgroud)
在php中,以下函数片段用于获取和比较随机数:
function ace($request) {
global $wpdb;
$timestamp = time();
$nonce = (string) $request['_nonce'];
$verify = check_ajax_referer( 'a', $nonce, false );
if ( …
Run Code Online (Sandbox Code Playgroud) 我有一个单页面应用程序(内置于 .net core MVC 2.2),其中 html 部分是动态加载的。
在主文档中,添加了具有动态生成标头的 CSP 策略,如下所示:
Content-Security-Policy: script-src 'self' 'nonce-I64vb811BxRNGV9Xf0pM'
Run Code Online (Sandbox Code Playgroud)
然后是通过 jquery ajax 加载函数加载的页面部分。page 部分包含一个带有随机数的脚本(来自 src)。带有 CSP 标头的页面部分看起来像
Content-Security-Policy: script-src 'self' 'nonce-ci5TQsyidT8x2jwBLRHS'
Run Code Online (Sandbox Code Playgroud)
一切都很好,但浏览器(chrome、safari 阻止脚本),带有消息:
jqueryscriptsbundle.js:formatted:43 Refused to execute inline script
because it violates the following
Content Security Policy directive: "script-src 'self' 'nonce-I64vb811BxRNGV9Xf0pM'
Run Code Online (Sandbox Code Playgroud)
因此,浏览器正在将脚本的随机数(即 ci5TQsyidT8x2jwBLRHS)与根/主页随机数值 I64vb811BxRNGV9Xf0pM 进行比较,因此脚本被阻止。
这是正确的行为吗?我该怎么做才能让它发挥作用?
我想向动态构造的脚本标记添加一个随机数。下面的代码不会向生成的脚本标签添加任何随机数。有人知道如何添加随机数吗?
var _wss = document.createElement('script');
_wss.nonce = 'random-string';
_wss.type = 'text/javascript';
_wss.charset = 'utf-8';
_wss.async = true;
_wss.src = "url";
var __wss = document.getElementsByTagName('script')[0];
__wss.parentNode.insertBefore(_wss, __wss);
Run Code Online (Sandbox Code Playgroud)
结果是:
<script type="text/javascript" charset="utf-8" async src="url"></script>
Run Code Online (Sandbox Code Playgroud)
预期结果:
<script nonce="random-string" type="text/javascript" charset="utf-8" async src="url"></script>
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个 ASSP.NET MVC Web 应用程序MyWebApp
,它不允许匿名访问任何页面。有一个IdentityServer4
配置,一旦用户尝试打开MyWebApp
,他就会被重定向到 IdentityServer 登录页面。(混合流)用户不会登录并在 IdentityServer 登录页面上停留足够长的时间,因此Nonce
cookie 会MyWebApp
过期(默认生存期为 15 分钟)。如果他继续在 IdentityServer 中登录(成功)并被重定向回MyWebApp
,他会收到以下错误:
Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolInvalidNonceException IDX21323:RequireNonce 为“[PII 已隐藏]”。OpenIdConnectProtocolValidationContext.Nonce 为 null,OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce 不为 null。无法验证随机数。如果不需要检查随机数,请将 OpenIdConnectProtocolValidator.RequireNonce 设置为“false”。请注意,如果找到“随机数”,则会对其进行评估。
但由于用户已在 IdentityServer 中成功进行身份验证,因此当他尝试MyWebApp
再次访问时,他会被重定向到IdentityServer
并返回MyWebApp
,而无需再次输入用户名/密码。然而最初的错误很烦人。当“登录”流程开始并且用户“AFK”时间足够长,以至于“Nonce”cookie 过期并且他无法完成最终验证时,有人遇到过这样的问题吗?处理这种情况的好方法是什么?
提前致谢!
nonce ×10
javascript ×3
php ×3
angular ×1
asp.net-mvc ×1
flickr ×1
html ×1
http-headers ×1
ios ×1
java-ws ×1
jquery ×1
oauth ×1
reactjs ×1
rest ×1
swift ×1
web-services ×1
webpack ×1
websecurity ×1
wordpress ×1