Tech Ideas

C++,Linux,Algorithm,Crypto,Lisp,etc

TLS协议分析 与 现代加密通信协议设计

最近发现密码学很有意思,刚好还和工作有点关系,就研究了一下,本文是其中一部分笔记和一些思考。

密码学理论艰深,概念繁多,本人知识水平有限,错误难免,如果您发现错误,请务必指出,非常感谢!

本文禁止转载

本文目标:

  1. 学习鉴赏TLS协议的设计,透彻理解原理和重点细节
  2. 跟进一下密码学应用领域的历史和进展
  3. 整理现代加密通信协议设计的一般思路

本文有门槛,读者需要对现代密码学有清晰而系统的理解,建议花精力补足背景知识再读。本文最后的参考文献里有一些很不错的学习资料。

目录 :

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

TLS协议分析 与 现代加密通信协议设计
一 . TLS协议的设计目标:
1. 密码学的方法论
2. TLS的设计目标
3. TLS的历史
二. TLS协议的原理
1. 自顶向下,分层抽象
3. TLS CipherSuite
4. 协议分层
5. record 协议
1. SecurityParameters
2. record层分段
3. record层的密码学保护
4. record层的密码学保护--MAC
5. record层的密码学保护--stream cipher
6. record层的密码学保护-- CBC block cipher
7. record层的密码学保护-- AEAD cipher
8. record层的密码学保护-- Key扩展
5. handshake 协议
1.handshake的总体流程
3. handshake 协议外层结构
4. handshake -- ClientHello,ServerHello,HelloRequest
4.1 Client Hello
4.2 Server Hello
4.3 Hello Extensions
4.4 Hello Request
5. handshake -- Server Certificate
6. handshake -- Server Key Exchange
7. handshake -- Certificate Request
8. handshake -- Server Hello Done
9. handshake -- Client Certificate
10. handshake -- Client Key Exchange
(1). RSA 加密的 Premaster Secret 消息
(2). 客户端 Diffie-Hellman 公钥
(3). 客户端 EC Diffie-Hellman 公钥
11. handshake -- Cerificate Verify
12. handshake -- Finished
13. handshake -- NewSessionTicket
6. ChangeCipherSpec 协议
7. Alert 协议
8. application data协议
8. TLS协议的安全分析
1. 认证和密钥交换 的安全性
1. 匿名密钥交换
2. RSA 密钥交换和认证
3. Diffie-Hellman 密钥交换和认证
2. 版本回退攻击
3. 针对握手过程的攻击
4. 针对 Resuming Sessions 的攻击
5. 针对应用数据保护的攻击
6. 显式 IV的安全性
7. 加密和MAC组合模式的安全性
8. DOS 攻击下的安全性
9.Session Ticket 的安全分析
1. 无效的Session
2. 窃取 Tickets
3. 伪造 Tickets
4. DoS 攻击
5. 加密 Ticket 的key 的管理
6. Ticket 的有效期
7. 其他的 Ticket 格式和分发方法
8. Identity Privacy, Anonymity, and Unlinkability
9. TLS扩展:
10. TLS的配套:PKI体系
1. X.509 证书
2.现有PKI体系暴露出的问题
1. public key pin
2. HSTS
11. TLS协议历史上出现过的漏洞,密码学常见陷阱
1. TLS的漏洞
2. 密码学常见陷阱
13. 下一代TLS: TLS 1.3
1. record层的密码学保护的改动
2.handshake协议的改动
3.1-RTT 握手
4. 有副作用的 0-RTT握手
5. Resumption 和 PSK
6. Key Schedule 过程的改动
三. TLS协议的代码实现
四. TLS协议的部署与优化
五. 更多的加密通信协议case:QUIC,iMessage,TextSecure, otr, ios HomeKit,libsodium
1. QUIC
2. apple ios iMessage
3. apple ios HomeKit
4. TextSecure
5. otr 协议
6. libsodium/NaCL
7. Tox.im
8. CurveCP
9. tcpcrypt
10.noise
11.tcpcrypt
12. netflix MSL
12.Amazon KMS 密钥管理服务 白皮书
六. TLS协议给我们的启发 -- 现代加密通信协议设计
七. 附录:密码学基础概念
1. 块加密算法 block cipher
2. 流加密算法 stream cipher
3. Hash函数 hash funtion
4. 消息验证码函数 message authentication code
5. 密钥交换 key exchange
6. 公钥加密 public-key encryption
7. 数字签名算法 signature algorithm
8. 密码衍生函数 key derivation function
9. 随机数生成器 random number generators
八. 参考文献:
TLS/SSL 相关RFC及标准
协议分析文章
实际部署调优相关
密码学相关
相关开源项目

[TOC]

现代密码学实践指南[2015年]


本文介绍目前现代密码学的最先进技术, 前半部分主要翻译自 《Cryptographic Right Answers》,附上收集的资料,和byron个人的理解。

密码学理论艰深,概念繁多,本人知识水平有限,错误难免,如果您发现错误,请务必指出,非常感谢!


下文分类介绍在各种适用场景下,你应该使用的现代密码学算法

1. 加密数据 :

按照优先级,应该选择:

(1) 首选 NaCl库,或者libsodium库,使用里面的crypto_secretbox()/crypto_secretbox_open() 函数 (2) Chacha20-Poly1305 算法 (3) AES-GCM 算法

适用场景:当你需要避免把明文数据在网络上传输的时候。

以上3种算法,都是AEAD类的算法,AEAD是2015年最好的选择。 其中的(2)和(3)在结构上类似:一个流加密模式的算法,配合一个多项式结构的MAC。 (2)是一个流加密算法,配合一个为通用cpu优化的MAC算法, 对密码学库的实现者来说,Poly1305也比GCM更容易安全地实现。 AES-GCM是工业标准(TLS目前主要用的就是AES-GCM),现代CPU通常都有专门为AES-GCM设计的硬件指令,但是在没有硬件指令支持的CPU上(比如32位的arm),(3)性能低于(2)。

Nginx下配置高性能,高安全性的https TLS服务

下文以nginx为例,介绍如何部署一个高性能,高安全性的https服务器。

并附送一个优化出来的openssl编译脚本,可以编译出一个高性能,高安全性的openssl库,您可以直接复制粘贴使用。

此处直接给出实践指导,后续再写文章解释tls协议的这些原理细节。

nginx下https配置的优化点,主要有:

  1. session ticket
  2. session id cache
  3. ocsp stapling
  4. http KeepAlive
  5. ECDHE等ciphersuite优化
  6. openssl 编译优化

一, nginx https的配置

先贴一下nginx配置,如下。

是根据mozilla的权威文档 ,和生成工具(选择 nginx,intermediate ) 生成的配置为基础,加入session ticket等配置的结果

【翻译】密码学一小时必知

本文翻译了Colin Percival 于2010年在bsdcan的演讲ppt

原文标题:Everything you need to know about cryptography in 1 hour

演讲时间:May 13, 2010

原文在 https://www.bsdcan.org/2010/schedule/attachments/135_crypto1hr.pdf

演讲视频在 https://www.youtube.com/watch?v=jzY3m5Kv7Y8 ( 请自行翻墙 )

Colin Percival 是密码学方面的专家,FreeBSD项目的安全长官,Tarsnap在线备份服务的创始人,scrypt密钥衍生算法的作者,致力于改进软件中密码学的应用,向程序员传播密码学的正确使用。

【翻译/介绍】jump Consistent hash:零内存消耗,均匀,快速,简洁,来自Google的一致性哈希算法

简介

jump consistent hash是一种一致性哈希算法, 此算法零内存消耗均匀分配快速,并且只有5行代码

此算法适合使用在分shard的分布式存储系统中 。

此算法的作者是 Google 的 John Lamping 和 Eric Veach,论文原文在 http://arxiv.org/ftp/arxiv/papers/1406/1406.2294.pdf

完整代码:

JumpConsistentHash
1
2
3
4
5
6
7
8
9
int32_t JumpConsistentHash(uint64_t key, int32_t num_buckets) {
    int64_t b = -1, j = 0;
    while (j < num_buckets) {
        b = j;
        key = key * 2862933555777941757ULL + 1;
        j = (b + 1) * (double(1LL << 31) / double((key >> 33) + 1));
    }
    return b;
}

输入是一个64位的key,和桶的数量(一般对应服务器的数量),输出是一个桶的编号。

SSL/TLS CipherSuite 介绍

本文是关于SSL/TLS的 CipherSuite 的信息摘录,翻译。如有疑问,欢迎指出。

一,CipherSuite的概念

CipherSuite 这个名词目前没看到有好的中文翻译,个人觉得翻译成“加密算法套件”比较合适。Cipher泛指是密码学的加密算法,例如 aes, rsa, ecdh 等。 tls是由各类基础算法,作为原语组合而成。 一个CipherSuite是4个算法的组合:

  1. 1个authentication (认证)算法
  2. 1个encryption(加密)算法
  3. 1个message authentication code (消息认证码 简称MAC)算法
  4. 1 个key exchange(密钥交换)算法

Mock C++ Function for Unit Test

在单元测试中,我们需要提供业务逻辑的mock版本, 当业务逻辑实现为C++的virtual function时,这是很容易的,我们只需要写一个子类, 实现virtual function就行了,Google 的 gmock就针对这种情况设计。

可是,如果遗留代码中有一般C函数,非virtual的类成员函数,模板函数,inline函数,如何提供mock版本呢?

下面的代码用一点trick实现了上述函数的运行时mock。

博客迁移到octopress

wordpress的编辑器混淆了 结构 和 表现 而markdown,类似latex,结构和表现分离,更符合我的偏好。

在vim里面写博客,更能激起人的写作欲望,浏览器里面,容易转移注意力。

octopress的博客还可以用git做版本管理,备份。

octopress内置了代码格式化,着色。

这些都比wordpress更适合做技术博客。

从wordpress导出数据使用了 https://github.com/benbalter/wordpress-to-jekyll-exporter

评论使用了 https://disqus.com ,只需要申请一个账号,然后填到_config.yml里面,就行了

google analytics也是,只需要申请,然后把ID填入_config.yml就ok了。

octopress并不适合放在 xxx.com/blog/ 这样的目录下面,一些js脚本不支持目录, 最好放在独立域名下面。

一个使用KuaiPan备份linux服务器的脚本

近日需要给服务器做备份,在网上找到了一个现成的金山快盘的api:https://github.com/deren/python-kuaipan (感谢!)
试了一下,遂决定备份到金山快盘上。

备份脚本考虑了以下几个方面的要求:
1.上传之前一定要加密,对比之后,使用了openssl的aes-256-cbc加密算法
2.增量备份,最开始尝试用duplicity ,写了一个duplicity的backend,然后发现,好复杂!猛然发现,linux上的tar就有增量备份功能,于是直接用了tar
3.分卷,KuaiPan有文件大小限制,此处用了split把tar文件分卷

代码放在 https://github.com/windydays/kuaipan_backup

A Http Proxy Script

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
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import base64
import select
import socket
import httplib
import os
import sys
#base64.encodestring("das\120xsdada\s")

def usage ():
    print "connect_to_http_proxy %s"
    print "usage: connect_to_http_proxy &lt;desthost&gt; &lt;destport&gt;"

if len(sys.argv) != 3:
    usage()
    print sys.argv
    sys.exit()

proxy_host="web-proxy-domain.com"
proxy_port="8080"
dest_host=""
dest_port=""
dest_host, dest_port=sys.argv[1:]

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((proxy_host,int(proxy_port)))
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
req="CONNECT "+dest_host+":"+dest_port + " HTTP/1.0\r\n\r\n"
sock.send(req)
resp=sock.recv(100000)
if resp.find("200") &lt; 0:
    print req,resp
    exit(-1)

ep=select.epoll()
ep.register(sock.fileno(),select.EPOLLIN)
ep.register(sys.stdin.fileno(),select.EPOLLIN)
while True:
    events=ep.poll(1,2)
    for fd,event in events:
        if event & select.EPOLLERR:
            sys.exit(0)
        if event & select.EPOLLIN and fd==sock.fileno():
            os.write(sys.stdout.fileno(),sock.recv(1024*100))
        if event & select.EPOLLIN and fd==sys.stdin.fileno():
            os.write(sock.fileno(),sys.stdin.read())

#conn=httplib.HTTPConnection(proxy_host+":"+proxy_port)
#conn.request("CONNECT",dest_host+":"+dest_port)
#res=conn.getresponse()
#print res.read()
#if res.status != 200:
#    print res.status,res.reason
#    sys.exit()