SSH认证
一、SSH在认证之前已经协商好了一个会话密钥(算法协商+公钥传输+…+会话密钥生成),然后在作用在后续的认证过程和所有数据传输过程中。认证过程只是一个身份验证登陆流程,只是决定是否要继续建立通道保持通信,下文讨论的就是不同的认证方式。
1ssh -p 22 user@host
基于密码的验证
客户端发送用户名和密码用先前协商的密钥加密后发送到服务器进行验证
服务端通过本地账号去查,匹配上就验证成功
基于公钥的验证
生成密钥对:首先在客户端生成一个密钥对,包括一个公钥和一个私钥。公钥可以公开,但私钥必须保密。
上传公钥到服务器:然后,将公钥上传到服务器,并添加到~/.ssh/authorized_keys文件中。这个文件存储了所有允许SSH密钥认证的公钥。
当认证流程开始时:客户端会发送一个包含公钥的消息给服务器。
服务器验证公钥:服务器会检查客户端发送的公钥是否在~/.ssh/authorized_keys文件中。如果公钥存在,服务器就知道客户端是一个可信的用户。
服务器发送挑战消息:服务器然后生成一个随机数(也被称为挑战,这个是最终是被双重 ...
OC之GCD
什么是GCD?GCD(Grand Central Dispatch)是异步执行任务的技术之一(iOS中其他多线程技术:pthread、NSThread、NSOperation)。开发者只需要定义想要执行的任务并追加到适当的Dispatch Quue中,GCD就能生成必要的线程并执行,通过GCD提供的系统级线程管理可以提高执行效率。
GCD队列
队列与线程的关系
队列和线程并非拥有关系,队列是任务容器(一种数据结构),CPU从队列中取出任务,放到对应的线程上去执行。
串行队列与并发队列
串行队列同时执行的处理数只有一个,按照顺序执行。
并发队列执的行顺序会取决于处理的任务量和系统的状态(CPU核数、CPU负荷等)。
多个串行队列可并发执行,每个串行队列都使用各自的一个线程。
当生成多个串行队列时,各个串行队列将并发执行。一旦生成串行队列并追加任务处理,系统对于一个串行队列就只使用一个线程。如果使用过多线程,就会消耗大量内存,引起大量的上下文切换,大幅度降低系统的响应性能。并发队列不会出现以上问题,不管生成多少,XNU内核只使用有效管理的线程。
主队列与全局队列
追加到主队列的任务在 ...
iOS之CoreText
有时候用网页展示一大片图文效果不怎么好,这时候就有必要用CoreText框架实现页面渲染了;
CoreText重要的几个元素
CTFramesetterRef
CTFrameRef
CTLineRef
CTRunRef
CTFrame 作为一个整体的画布(Canvas),其中由行(CTLine)组成,而每行可以分为一个或多个小方块(CTRun)。
一般流程
使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw);
细节
DisplayView继承子UIView,重写[drawRect:]方法。该方法通过传入的CTFrameRef,然后通过CTFrameDraw(self.data.ctFrame, context)就显示完毕;
自定义一个Parser把接口数据转换成包含CTFrameRef的CoreTextData的对象,解析过程如下:
创建AttributeString,这一 ...