-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
263 lines (229 loc) · 52.2 KB
/
Copy pathatom.xml
File metadata and controls
263 lines (229 loc) · 52.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Pan's paper</title>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2016-05-20T08:01:09.000Z</updated>
<id>http://yoursite.com/</id>
<author>
<name>Zhang pan</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Lua Module 实践</title>
<link href="http://yoursite.com/2016/05/20/LuaModule%E5%AE%9E%E8%B7%B5/"/>
<id>http://yoursite.com/2016/05/20/LuaModule实践/</id>
<published>2016-05-20T07:54:16.000Z</published>
<updated>2016-05-20T08:01:09.000Z</updated>
<content type="html"><p>最近用openresty写接口,每个接口都要要链接数据库,写一个通用的模块来实现,顺便学习下lua module的相关知识。</p>
<a id="more"></a>
<h3 id="lua-模块"><a href="#lua-模块" class="headerlink" title="lua 模块"></a>lua 模块</h3><p>Lua中的一个模块就是一个table,table元素包括变量,函数等。“因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table”。</p>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 文件名为 module.lua</span></span><br><span class="line"><span class="comment">-- 定义一个名为 module 的模块</span></span><br><span class="line"><span class="built_in">module</span> = &#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 定义一个常量</span></span><br><span class="line"><span class="built_in">module</span>.constant = <span class="string">"这是一个常量"</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 定义一个函数</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">module.func1</span><span class="params">()</span></span></span><br><span class="line"> <span class="built_in">io</span>.write(<span class="string">"这是一个公有函数!\n"</span>)</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">local</span> <span class="function"><span class="keyword">function</span> <span class="title">func2</span><span class="params">()</span></span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"这是一个私有函数!"</span>)</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">module.func3</span><span class="params">()</span></span></span><br><span class="line"> func2()</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="built_in">module</span></span><br></pre></td></tr></table></figure>
<h4 id="require函数"><a href="#require函数" class="headerlink" title="require函数"></a>require函数</h4><p>require函数用来加载模块。</p>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">require</span>(<span class="string">"&lt;模块名&gt;"</span>)</span><br><span class="line"><span class="comment">-- 或</span></span><br><span class="line"><span class="built_in">require</span><span class="string">"&lt;模块名&gt;"</span></span><br></pre></td></tr></table></figure>
<p>也可以给模块一个别名,方便调用</p>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">local</span> m = <span class="built_in">require</span>(<span class="string">"module"</span>)</span><br><span class="line"></span><br><span class="line">m.func1</span><br></pre></td></tr></table></figure>
<h4 id="加载机制"><a href="#加载机制" class="headerlink" title="加载机制"></a>加载机制</h4><p>对于我们自定义的模块,并不是放在那个目录都行,require有一套自己的文件加载机制。</p>
<blockquote>
<p>require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中,当 Lua 启动后,会以环境变量 LUA_PATH 的值来初始这个环境变量。如果没有找到该环境变量,则使用一个编译时定义的默认路径来初始化。</p>
</blockquote>
<p>如果我们设置LUA_PATH环境变量(参考1)</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#LUA_PATH</span></span><br><span class="line"><span class="built_in">export</span> LUA_PATH=<span class="string">"~/lua/?.lua"</span></span><br></pre></td></tr></table></figure>
<p>那么调用 require(“module”) 时就会尝试打开以下文件目录去搜索目标。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">/Users/dengjoe/lua/module.lua;</span><br><span class="line">./module.lua</span><br><span class="line">/usr/local/share/lua/5.1/module.lua</span><br><span class="line">/usr/local/share/lua/5.1/module/init.lua</span><br><span class="line">/usr/local/lib/lua/5.1/module.lua</span><br><span class="line">/usr/local/lib/lua/5.1/module/init.lua</span><br></pre></td></tr></table></figure>
<h3 id="openresty-实践"><a href="#openresty-实践" class="headerlink" title="openresty 实践"></a>openresty 实践</h3><p>写一个链接数据库的module</p>
<h4 id="设置module路径"><a href="#设置module路径" class="headerlink" title="设置module路径"></a>设置module路径</h4><p>在openresty中设置module路径的方式:</p>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lua_package_path <span class="string">'lua/?.lua;/Users/zhangpan/Project/XinanServer/XinanServer/lua/module/?.lua;;'</span>;</span><br></pre></td></tr></table></figure>
<p>其中<code>lua/?.lua;</code> 代表的绝对路径是 <code>~/lua/?.lua;</code>;后面一个是绝对路径。</p>
<h4 id="设计module"><a href="#设计module" class="headerlink" title="设计module"></a>设计module</h4><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">xinandb = &#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建数据库链接实例</span></span><br><span class="line"><span class="keyword">local</span> mysql = <span class="built_in">require</span> <span class="string">"resty.mysql"</span></span><br><span class="line"></span><br><span class="line">xinandb.db = mysql:new()</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 连接数据库</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">xinandb.connect</span><span class="params">()</span></span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> xinandb.db <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">local</span> ok, err, errno, sqlstate = (xinandb.db):connect &#123;</span><br><span class="line"> host = <span class="string">"127.0.0.1"</span>,</span><br><span class="line"> port = <span class="number">3306</span>,</span><br><span class="line"> database = <span class="string">"xinan"</span>,</span><br><span class="line"> user = <span class="string">"***"</span>,</span><br><span class="line"> password = <span class="string">"***"</span>,</span><br><span class="line"> max_packet_size = <span class="number">1024</span> * <span class="number">1024</span> &#125;</span><br><span class="line"> <span class="keyword">return</span> ok </span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> xinandb</span><br></pre></td></tr></table></figure>
<h4 id="yield"><a href="#yield" class="headerlink" title="yield"></a>yield</h4><p>这里遇到的一个问题:开始想创建db时就直接链接</p>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">xinandb.db = mysql:new()</span><br><span class="line"></span><br><span class="line"><span class="keyword">local</span> ok, err, errno, sqlstate = (xinandb.db):connect &#123;</span><br><span class="line"> host = <span class="string">"127.0.0.1"</span>,</span><br><span class="line"> port = <span class="number">3306</span>,</span><br><span class="line"> database = <span class="string">"xinan"</span>,</span><br><span class="line"> user = <span class="string">"***"</span>,</span><br><span class="line"> password = <span class="string">"***"</span>,</span><br><span class="line"> max_packet_size = <span class="number">1024</span> * <span class="number">1024</span> &#125;</span><br></pre></td></tr></table></figure>
<p>这样就会报一个错误</p>
<blockquote>
<p>[error] 7091#0: *291 lua entry thread aborted: runtime error: attempt to yield across C-call boundary</p>
</blockquote>
<p>最终参考文章<a href="https://orchina.org/topic/50/view" target="_blank" rel="external">关于在config.lua中加入resolver包,出现跨界问题</a>解决。</p>
<p>解决方式:把连接数据库操作封装在一个函数中供调用。</p>
<h4 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h4><p>使用就比较简单了,和其他一样</p>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 连接DB</span></span><br><span class="line"><span class="keyword">local</span> xinandb = <span class="built_in">require</span>(<span class="string">"xinandb"</span>)</span><br><span class="line"><span class="keyword">local</span> res = xinandb:connect()</span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> res <span class="keyword">then</span></span><br><span class="line"> ngx.say(<span class="string">"&#123;\"errorCode\" : 1003, \"errorMessage\" : \"连接数据库错误\"&#125;"</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"><span class="keyword">local</span> db = xinandb.db;</span><br></pre></td></tr></table></figure>
<h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><h4 id="参考1:设置环境变量的方式:"><a href="#参考1:设置环境变量的方式:" class="headerlink" title="参考1:设置环境变量的方式:"></a>参考1:设置环境变量的方式:</h4><blockquote>
<p>如果没有 LUA_PATH 这个环境变量,也可以自定义设置,在当前用户根目录下打开 .profile文件(没有则创建,打开 .bashrc 文件也可以),例如把 “~/lua/“ 路径加入 LUA_PATH 环境变量里;</p>
</blockquote>
<p>然后执行</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.profile</span><br></pre></td></tr></table></figure>
<h4 id="坑:再次打开终端环境变量失效"><a href="#坑:再次打开终端环境变量失效" class="headerlink" title="坑:再次打开终端环境变量失效"></a>坑:再次打开终端环境变量失效</h4><p>用的是Mac系统,shell是zsh。按照上面的方式设置了环境变量后,关闭终端,再次打开后环境变量就失效了。</p>
<p>解决方式:将LUA_PATH添加到.zshrc 执行</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure></content>
<summary type="html">
<p>最近用openresty写接口,每个接口都要要链接数据库,写一个通用的模块来实现,顺便学习下lua module的相关知识。</p>
</summary>
</entry>
<entry>
<title>RSA(二)</title>
<link href="http://yoursite.com/2016/05/05/rsa-sercurity-2/"/>
<id>http://yoursite.com/2016/05/05/rsa-sercurity-2/</id>
<published>2016-05-05T08:21:01.000Z</published>
<updated>2016-05-05T08:28:31.000Z</updated>
<content type="html"><p>本文中将会使用iOS的Security.framework,写一个类来是先在iOS客户端的加解密操作。同时将这个类封装到一个静态文件中来加强安全性,感觉贴代码好傻,需要的还是去github上clone吧!不贴代码内容一下变少了,所以把本来在第三篇的内容,放到这里吧!所以这篇的重要内容是,iOS实践+ https介绍 + nginx https实践,内容有点不搭。</p>
<a id="more"></a>
<h3 id="iOS实践项目"><a href="#iOS实践项目" class="headerlink" title="iOS实践项目"></a>iOS实践项目</h3><p>项目代码还是不在这个贴了,有需要的可以去<a href="https://github.com/zzpan/zzpan_rsa_ios_demo" target="_blank" rel="external">这里</a> clone, 两点说明</p>
<ul>
<li>存放公钥需要用DER格式的文件,存放私钥需要使用p12格式的文件</li>
<li>加密数据过长需要分片,Demo中未实现此步骤</li>
</ul>
<h3 id="传输层安全协议-TLS"><a href="#传输层安全协议-TLS" class="headerlink" title="传输层安全协议(TLS)"></a>传输层安全协议(TLS)</h3><p>TLS提供两个应用程序间,通过网络的一个不安全通道,创建起安全的连接,来交换数据,防止数据受到窃听及篡改。</p>
<h4 id="超文本传输安全协议-HTTPS"><a href="#超文本传输安全协议-HTTPS" class="headerlink" title="超文本传输安全协议(HTTPS)"></a>超文本传输安全协议(HTTPS)</h4><p>HTTPS是HTTP和TLS的组合,用TLS创建安全链接,用HTTP交换数据。</p>
<h4 id="TLS的握手过程"><a href="#TLS的握手过程" class="headerlink" title="TLS的握手过程"></a>TLS的握手过程</h4><p>握手可分为三个阶段: </p>
<ul>
<li>协商对等支持的密钥算法(密钥交换的非对称加解密算法、数据加密的对称密钥算法和会话密钥生成的散列函数)</li>
<li>基于PKI证书的身份认证和非对称密钥的信息传递(传递随机数3)</li>
<li>对称密钥生成和基于对称密钥的数据传输保密。</li>
</ul>
<p>双向证书认证和SSL握手过程:</p>
<p><a href="http://7xsxhy.com2.z0.glb.clouddn.com/blog%2Fssl_handshake.png" target="_blank"><img src="http://7xsxhy.com2.z0.glb.clouddn.com/blog%2Fssl_handshake.png" style="width:300px"></a></p>
<p>关于TLS更详细的信息可以参考<a href="https://zh.wikipedia.org/wiki/%E5%82%B3%E8%BC%B8%E5%B1%A4%E5%AE%89%E5%85%A8%E5%8D%94%E8%AD%B0" target="_blank" rel="external">wiki-传输层安全协议</a></p>
<p>两点说明</p>
<ul>
<li>客户端没证书时可以随机生成证书</li>
<li>记录层的所有数据都被编号,用于消息校验码的校验</li>
</ul>
<p>理论上的东西就说这么多了,我们现在要使用用https</p>
<h3 id="使用Nginx建一个简单的HTTPS服务器"><a href="#使用Nginx建一个简单的HTTPS服务器" class="headerlink" title="使用Nginx建一个简单的HTTPS服务器"></a>使用Nginx建一个简单的HTTPS服务器</h3><p>首先要创建私钥和公钥证书。可以参考<a href="http://zpisl.com/2016/05/03/rsa-sercurity-1/" target="_blank" rel="external">RSA(一)</a>的openssl实践部分创建。然后在nginx的启动目录中创建ssl文件夹,放入公钥证书和私钥,</p>
<p>在conf文件中添加https server,https的默认端口是443,当然你也可以指定端口。</p>
<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line"> <span class="attribute">listen</span> <span class="number">443</span>;</span><br><span class="line"></span><br><span class="line"> <span class="attribute">root</span> /Users/zhangpan/apps/www;</span><br><span class="line"> <span class="attribute">index</span> index.html index.htm;</span><br><span class="line"></span><br><span class="line"> <span class="attribute">ssl</span> <span class="literal">on</span>;</span><br><span class="line"> <span class="attribute">ssl_certificate</span> ../ssl/xinan_public_key.cer;</span><br><span class="line"> <span class="attribute">ssl_certificate_key</span> ../ssl/xinan_private_key.pem;</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure>
<p>尝试https访问localhost的时候,浏览器就会提示我们证书不受信。点击信任证书就可以和服务器使用https通信了。</p>
<h4 id="优化参数"><a href="#优化参数" class="headerlink" title="优化参数"></a>优化参数</h4><ul>
<li>通过<code>ssl_session_cache</code>参数设置缓存类型和大小,</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssl_session_cache shared:SSL:10m;</span><br></pre></td></tr></table></figure>
<p>设置缓存类型为shared:SSL 表示我所有的nginx工作进程共享ssl会话缓存,缓存大小为10MB。</p>
<ul>
<li>通过<code>ssl_session_timeout</code>设置超时时间</li>
</ul>
<p>系统默认的时间是5m,稍短可以设置成30m甚至4h。</p>
<h4 id="体验https"><a href="#体验https" class="headerlink" title="体验https"></a>体验https</h4><p>分别使用http和https写了一个api,使用Charles抓包获取的response如下,可以明显看到https的传输内容已加密。</p>
<p>http数据包</p>
<p><a href="http://7xsxhy.com2.z0.glb.clouddn.com/blog%2Fverify_http.png" target="_blank" rel="external"><img src="http://7xsxhy.com2.z0.glb.clouddn.com/blog%2Fverify_http.png" style="width:600px"></a></p>
<p>https数据包</p>
<p><a href="http://7xsxhy.com2.z0.glb.clouddn.com/blog%2Fverify_https.png" target="_blank" rel="external"><img src="http://7xsxhy.com2.z0.glb.clouddn.com/blog%2Fverify_https.png" style="width:600px"></a></p>
<h2 id="吐槽"><a href="#吐槽" class="headerlink" title="吐槽"></a>吐槽</h2><p>研究RSA的起因是加密传输用户密码。其实用户密码加密是一个单向加密,完全不知道什么地方需要解密用户密码。后来使用sha哈希用户密码存服务器了。数据传输加密可以用https,不需要自己在客户端或服务器去做加解密操作。问题简单了····</p>
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="http://seanlook.com/2015/05/28/nginx-ssl/" target="_blank" rel="external">nginx配置ssl加密(单双向认证、部分https)</a> 如果链接无效可以点击<a href="http://7xsxhy.com2.z0.glb.clouddn.com/savenginx-ssl_.pdf" target="_blank" rel="external">这里</a>下载</p>
<p><a href="https://zh.wikipedia.org/wiki/%E5%82%B3%E8%BC%B8%E5%B1%A4%E5%AE%89%E5%85%A8%E5%8D%94%E8%AD%B0" target="_blank" rel="external">wikipedia-传输层安全协议</a></p>
</content>
<summary type="html">
<p>本文中将会使用iOS的Security.framework,写一个类来是先在iOS客户端的加解密操作。同时将这个类封装到一个静态文件中来加强安全性,感觉贴代码好傻,需要的还是去github上clone吧!不贴代码内容一下变少了,所以把本来在第三篇的内容,放到这里吧!所以这篇的重要内容是,iOS实践+ https介绍 + nginx https实践,内容有点不搭。</p>
</summary>
</entry>
<entry>
<title>RSA(一)</title>
<link href="http://yoursite.com/2016/05/03/rsa-sercurity-1/"/>
<id>http://yoursite.com/2016/05/03/rsa-sercurity-1/</id>
<published>2016-05-03T08:53:17.000Z</published>
<updated>2016-05-05T08:28:37.000Z</updated>
<content type="html"><p>最近iOS客户端开发需要用到RSA加密与服务端通信,还未涉及过此方面知识,写篇文章学习下。这篇介绍RSA,签名相关概念和openssl证书生成的相关命令。</p>
<a id="more"></a>
<h2 id="RSA"><a href="#RSA" class="headerlink" title="RSA"></a>RSA</h2><p>RSA是经典的非对称加密算法。原理就不多介绍了,不研究密码学也没必要深入了解。加解密流程也比简单。但是其中的密钥交换,数字签名,认证中心比较繁琐。画个图</p>
<p><img src="http://7xsxhy.com2.z0.glb.clouddn.com/blog%2FRSA.png" width="600" align="center"></p>
<h4 id="两个概念"><a href="#两个概念" class="headerlink" title="两个概念"></a>两个概念</h4><ul>
<li>加密:发送者使用接受者的公钥对发送信息进行加密操作</li>
<li>签名:发送者使用自己私钥对信息进行的加密操作</li>
</ul>
<h4 id="签名的一般做法和作用"><a href="#签名的一般做法和作用" class="headerlink" title="签名的一般做法和作用"></a>签名的一般做法和作用</h4><p>发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。</p>
<p>签名有两个重要作用:</p>
<ul>
<li>确定消息确实是由发送方签名并发出来的。</li>
<li>数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将发生变化。不同的文件将得到不同的数字摘要。</li>
</ul>
<h4 id="中间人攻击和CA"><a href="#中间人攻击和CA" class="headerlink" title="中间人攻击和CA"></a>中间人攻击和CA</h4><p>关于中间人攻击维基百科解释的非常好,而且配了生动的示例<a href="https://zh.wikipedia.org/wiki/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB#.E9.98.B2.E5.BE.A1.E6.94.BB.E5.87.BB" target="_blank" rel="external">wiki-中间人攻击</a>。</p>
<p><img src="http://7xsxhy.com2.z0.glb.clouddn.com/blog%2Frsa_man_in_middle.png" width="600" align="center"></p>
<p>中间人是破坏了通信中的密钥分配环节,把自己的公钥伪装成别人公钥。 CA(Certificate Authority)就是专门提供网络身份认证服务的机构。</p>
<h2 id="Openssl-实践"><a href="#Openssl-实践" class="headerlink" title="Openssl 实践"></a>Openssl 实践</h2><p><strong>生成私钥</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl genrsa -out root_private_key.pem 1024</span><br></pre></td></tr></table></figure>
<p><strong>创建公钥</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rsa -in root_private_key.pem -out root_public_key.pem -pubout</span><br></pre></td></tr></table></figure>
<p>公私钥是一一对应的,所以生成公钥需要指定一个私钥。</p>
<p><strong>加密文件</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rsautl -encrypt -pubin -inkey root_public_key.pem -in plain.txt -out cipher.txt</span><br></pre></td></tr></table></figure>
<p><strong>解密文件</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rsautl -decrypt -inkey root_private_key.pem -in cipher.txt -out plain.txt</span><br></pre></td></tr></table></figure>
<p>如果加密/解密文件过大,会报”openssl data greater than mod len”错误。这是因为RSA算法对加密文件的长度是有限制的。过大的话需要分片加密。(测试的时候加密”hello”可以,加密”hello world!”,解密的时候竟然就报错了)</p>
<p><strong>创建证书请求</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl req -new -out root-req.csr -key root_private_key.pem -keyform PEM</span><br></pre></td></tr></table></figure>
<p>为了证实身份证书请求要用私钥签名。</p>
<p><strong>自签生成公钥证书</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl x509 -req -in root-req.csr -out root_public_key.der -outform der -signkey root_private_key.pem -days 3650</span><br></pre></td></tr></table></figure>
<p>也可以导出cer格式的证书, 就可以使用cer格式的证书和密钥导出p12格式的信息交换文件</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl x509 -req -in root-req.csr -out root_public_key.cer -signkey root_private_key.pem -days 3650</span><br></pre></td></tr></table></figure>
<p>在这一步中我们自己扮演了CA角色</p>
<p><strong>导出p12格式证书</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl pkcs12 -export -clcerts -in root-cert.cer -inkey root_private_key.pem -out root.p12</span><br></pre></td></tr></table></figure>
<p>p12文件通常用于保存个人私钥</p>
<p><strong>自签根证书</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl x509 -req -in root-req.csr -out root-cert.cer -signkey root_private_key.pem -CAcreateserial -days 3650</span><br></pre></td></tr></table></figure>
<h4 id="证书格式说明"><a href="#证书格式说明" class="headerlink" title="证书格式说明"></a>证书格式说明</h4><table>
<thead>
<tr>
<th>格式</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>pem</td>
<td>PEM(Privacy Enhanced Mail)是openssl默认采用的信息存放方式。一般包含内容类型、头信息和信息体(BASE64编码的数据)</td>
</tr>
<tr>
<td>csr</td>
<td>(Certificate Signing Request)即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥</td>
</tr>
<tr>
<td>der</td>
<td>(Distinguished Encoding Rules)二进制格式的证书文件,不可读</td>
</tr>
<tr>
<td>p12</td>
<td>以pkcs#12格式存储的证书和相应私钥,他通常包含保护密码,2进制方式 通常用于保存个人私钥</td>
</tr>
<tr>
<td>crt/cer</td>
<td>用于存放证书,2进制形式</td>
</tr>
</tbody>
</table>
<p>##参考</p>
<p><a href="https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95" target="_blank" rel="external">RSA加密算法</a><br><a href="http://honglu.me/2015/05/16/%E5%86%8D%E8%B0%88RSA-%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BA%92%E9%80%9A/" target="_blank" rel="external">再谈RSA-客户端与服务器互通</a></p>
<h2 id="下一步"><a href="#下一步" class="headerlink" title="下一步"></a>下一步</h2><p>接下来我们将使用iOS的Security框架,在iOS端实现RSA加解密。</p>
</content>
<summary type="html">
<p>最近iOS客户端开发需要用到RSA加密与服务端通信,还未涉及过此方面知识,写篇文章学习下。这篇介绍RSA,签名相关概念和openssl证书生成的相关命令。</p>
</summary>
</entry>
<entry>
<title>Hexo & GitHub 建站记录</title>
<link href="http://yoursite.com/2016/04/27/hexo1/"/>
<id>http://yoursite.com/2016/04/27/hexo1/</id>
<published>2016-04-27T08:24:19.000Z</published>
<updated>2016-04-27T09:50:01.000Z</updated>
<content type="html"><p>本站用Hexo 生成,部署在github上;这里记录下搭建过程和查阅的资料。用jekyll试过几次,感觉太麻烦,半途而废了。用Hexo一天多就差不多了,称赞下Hexo的强大。</p>
<a id="more"></a>
<h3 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h3><h5 id="安装NodeJS-NPM"><a href="#安装NodeJS-NPM" class="headerlink" title="安装NodeJS + NPM"></a>安装NodeJS + NPM</h5><p>到<a href="http://nodejs.cn/" target="_blank" rel="external">NodeJS官网</a>下载安装即可,我用的是成熟稳定版(4.4.2)会一并安装npm</p>
<h5 id="安装Hexo"><a href="#安装Hexo" class="headerlink" title="安装Hexo"></a>安装Hexo</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo npm install -g hexo-cli</span><br></pre></td></tr></table></figure>
<p>更多Hexo信息查看<a href="https://hexo.io/" target="_blank" rel="external">Hexo官方网站</a></p>
<h5 id="创建Github-pages"><a href="#创建Github-pages" class="headerlink" title="创建Github pages"></a>创建Github pages</h5><p>只要在github上创建一个名为username.github.io的项目即可。更详细信息和操作可以查阅<br><a href="https://pages.github.com/" target="_blank" rel="external">github pages 文档</a></p>
<h5 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h5><p>选择一个hexo主题,我这里选用的是<a href="https://github.com/pinggod/hexo-theme-apollo" target="_blank" rel="external">apollo</a>。这个主题的readme详细介绍了使用方法并配有视频。更多主题可以参考hexo提供的<a href="https://hexo.io/themes/" target="_blank" rel="external">主题库</a>,在这里推荐另一个主题<a href="https://github.com/wuchong/jacman/blob/master/README_zh.md" target="_blank" rel="external">jacman</a>,功能相对多一点。</p>
<h5 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h5><p><a href="https://hexo.io/zh-cn/docs/index.html" target="_blank" rel="external">Hexo 官方配置文档</a>已经够详细了,而且有中文版^_^。另外每个主题也是有yml配置文件的,通过修改它我们可以对主题进行配置。</p>
<h3 id="自动部署"><a href="#自动部署" class="headerlink" title="自动部署"></a>自动部署</h3><h5 id="安装插件"><a href="#安装插件" class="headerlink" title="安装插件"></a>安装插件</h5><p>首先安装插件hexo-deployer-git, 在Blog目录下执行:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure>
<h5 id="配置yml"><a href="#配置yml" class="headerlink" title="配置yml"></a>配置yml</h5><p>修改_config.yml 添加以下内容:</p>
<figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span> </span><br><span class="line"><span class="attr"> type:</span> git</span><br><span class="line"><span class="attr"> repo:</span> [github repo]</span><br><span class="line"><span class="attr">branch:</span> master</span><br></pre></td></tr></table></figure>
<p>这里repo地址最好用https,如果用ssh的,可能需要额外配置,否则会提示权限问题。</p>
<h5 id="自动发布"><a href="#自动发布" class="headerlink" title="自动发布"></a>自动发布</h5><p>完成上面两步后就可以使用下面命令自动发布了</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo d --g</span><br></pre></td></tr></table></figure>
<p>做到这里应该可以访问name.github.io 看到我们的blog。</p>
<h3 id="自定义域名"><a href="#自定义域名" class="headerlink" title="自定义域名"></a>自定义域名</h3><p>首先注册域名,在 godaddy 或<a href="https://wanwang.aliyun.com/domain" target="_blank" rel="external">万网</a>都可以,最好不要注册cn<br>域名,备案太坑。</p>
</content>
<summary type="html">
<p>本站用Hexo 生成,部署在github上;这里记录下搭建过程和查阅的资料。用jekyll试过几次,感觉太麻烦,半途而废了。用Hexo一天多就差不多了,称赞下Hexo的强大。</p>
</summary>
</entry>
</feed>