安全和密码学
关注比如散列函数、密钥生成函数、对称/非对称密码体系,这些安全和密码学概念是如何应用于前几节课所学到的工具(Git和SSH)
熵
熵度量了不确定性并可以用来决定密码的强度。一般我们认为攻击者了解密码的模型,但不了解某个密码是如何随机选择的。大约40比特的熵足以对抗在线穷举攻击。而对于离线穷举攻击,一般需要更强的密码。
散列函数
密码散列函数可以将任意大小的数据映射为一个固定大小的输出。一个散列函数的大概规范:
hash(value:array<byte>) -> vector<byte,N> (N对于该函数固定)
抽象地讲,散列函数可以被认为是一个不可逆,且看上去随机(但具确定性)的函数。散列函数具有以下特性:
- 确定性:对于不变的输入永远有相同的输出
- 不可逆性:对于
hash(m)=h
,难以通过已知的输出h
来计算原始输入m
- 目标碰撞抵抗性/弱无碰撞:对于一个给定输入
m_``,难以找到
m_2!=m_1且
hash(m_1)=hash(m_2)` - 碰撞抵抗性/强无碰撞:难以找到一组满足
hash(m_1)=hash(m_2)
的输入m_1,m_2
(该性质严格强于目标碰撞抵抗性)。
密码散列函数的应用
- Git中的内容寻址存储
- 文件的信息摘要
- 承诺机制
密钥生成函数
作为密码散列函数的相关概念,被应用于包括生成固定长度,可以使用在其他密码算法中的密钥等方面。为了对抗穷举法攻击,密钥生成函数通常较慢。
密钥生成函数的应用
- 从密码生成可以在其他加密算法中使用的密钥
- 存储登录凭证时不可直接存储明文密码
对称加密
首先想到隐藏明文信息。对称加密使用以下几个方法:
keygen() -> key
encrypt(plaintext: array<byte>,key) -> array<byte>
decrypt(ciphertext: array<byte>,key) ->array<byte>
加密方法encrypt()
输出密文ciphertext
很难在不知道key
的情况下得出明文plaintext
解密方法decrypt()
有明显的正确性。因为功能要求给定密文及其密钥,解密方法必须输出明文:decrypt(encrypt(m,k),k)=m
对称加密的应用
加密不信任的云服务上存储的文件。对称加密和密钥生成函数配合起来,就可以使用密码加密文件
非对称加密
”非对称“代表在其环境中,使用两个具有不同功能的密钥:一个是私钥,不向外公布;另一个是公钥,公布公钥不像公布对称加密的共享密钥那样可能影响加密体系的安全性。
非对称加密的应用
- PGP电子邮件加密
- 聊天加密
- 软件签名
密钥分发
非对称加密面对的主要挑战是,如何分发公钥并对应现实世界中存在的人或组织
- Signal的信任模型,信任用户第一次使用时给出的身份,同时支持用户线下、面对面交换公钥
- PGP使用的是信任网络
- Keybase主要使用社交网络证明
案例分析
- 密码管理器
- 两步验证(双因子验证)
- 全盘加密
- 聊天加密
- SSH