独立博客阅读:https://thiscute.world/posts/practical-cryptography-basics-1/
本文主要翻译自 Practical-Cryptography-for-Developers-Book
零、前言
你是软件开发人员吗?有时你会需要在日常工作中使用哈希、加密或数字签名等密码学工具吗?
你认为密码学很复杂,充满了数学知识,而且只适合书呆子吗?
不,不是这样滴,每个开发人员都可以学习如何使用加密算法。
从开发人员的角度理解密码学概念不需要你是一个牛逼的数学家。
本书将以几乎没有数学内容的方式教你应用密码学的基础知识,而且包含大量循序渐进的代码示例和实践练习——就像你学习 Web 开发、数据库或 APP 一样。
没错,如果你能够学会 Web 开发或 RESTful 服务,那么你也完全可以学会实用密码学。这就像学习一个新的 API 或一个新的 Web 开发框架,只要掌握了概念 + 加密库 API + 工具 + 最佳实践,你就学会了实用密码学~
从本书中,你将学习如何使用密码算法和密码系统,如哈希、MAC 码和密钥派生函数 (KDF)、随机生成器、密钥交换协议、对称密码算法、加密方案、非对称密码系统、公钥密码学、椭圆曲线、数字签名和量子安全加密算法,以及现代加密工具和库。
一、现代密码学概览
密码学已经从第一代广泛应用的密码学算法(比如已经退役的 MD5 跟 DES),发展到现代密码学算法(如 SHA-3, Argon2 以及 ChaCha20)。
让我们首先跟一些基本的密码学概念混个脸熟:
- 哈希函数,如 SHA-256, SHA3, RIPEMD and others
- 散列消息认证码 HMAC (hashed message authentication code)
- 密钥派生函数 KDF(key derivation functions),如 Scrypt
- 密钥交换算法,Diffie-Hellman 密钥交换协议
- 对称密钥加密方案(symmetric key encryption schemes),如「具有 CBC 和 CTR 块模式的 AES 密码」
- 使用公私钥的非对称密钥加密方案(asymmetric key encryption schemes),如 RSA 和 ECC, secp256k1 曲线 跟 Ed25519 密码系统
- 数字签名算法,如 ECDSA
- 熵(entropy)与安全随机数生成
- 量子安全(quantum-safe)密码学
上述这些概念涉及到技术被广泛应用在 IT 领域,如果你有过一些开发经验,可能会很熟悉其中部分名词。
如果不熟也没任何关系,本书的目的就是帮你搞清楚这些概念。
二、什么是密码学
密码学(Cryptography)是提供信息安全和保护的科学。
它在我们的数字世界中无处不在:当你打开网站、发送电子邮件或连接到 WiFi 网络时。这就是为什么开发人员至少应该对密码学有基本的了解,至少也得知道如何使用密码算法和密码库,了解哈希、对称密码算法、非对称密码算法(cipher)与加密方案这些概念,知晓数字签名及其背后的密码系统和算法。
1. 加密与密钥 - Encryption and Keys
密码学以安全的方式进行数据的存储和传输,这样只有那些预期的人才能读取和处理它。
这可能涉及使用对称或非对称加密方案加密和解密数据,其中一个或多个密钥用于将数据从明文转换为加密形式或者相反。
对称加密(如 AES、Twofish 和 ChaCha20)使用相同的密钥来加密和解密消息,
而非对称加密使用公钥密码系统(如 RSA 或 ECC)和密钥对来进行这两项操作:公钥(加密密钥)和相应的私钥密钥(解密密钥)。
加密算法通常结合在加密方案中,如 AES-256-CTR-HMAC-SHA-256、ChaCha20-Poly1305 或 ECIES-secp256k1-AES-128-GCM。
密码学也涉及密钥的生成(一个非常大的、保密的数字),在许多情况下,这些密钥是使用密钥派生算法(如 PBKDF2 和 Scrypt)从数字、密码(passwords)或密码词组(passphrases)中派生的。
2. 数字签名与消息认证 - Digital Signatures and Message Authentication
密码学提供了保证消息真实性(authenticity)、完整性(integrity)和不可否认性(non-repudiation)的消息数字签名方法。
大多数数字签名算法(如 DSA、ECDSA 和 EdDSA)使用非对称密钥对(私钥和公钥)干这个活:消息由私钥签名,签名由相应的公钥验证。
在银行系统中,数字签名用于签署和批准付款。
在区块链签名交易中,用户可以将区块链资产从一个地址转移到另一个地址,确保转移操作的真实、完整、不可否认。
消息认证算法(如 HMAC)和消息认证码(MAC 码)也是密码学的一部分,它们被用于证明消息的真实性(authenticity)、完整性(integrity)和作者身份(authorship)。MAC 同时使用了身份验证与加密,以确保安全通信。
3. 安全随机数 - Secure Random Numbers
密码学的另一个部分,是熵(entropy,不可预测的随机性)和随机数的安全生成(例如使用 CSPRNG)。
安全随机数理论上是不可预测的,但是开发人员也应该关心它们,因为有问题的随机生成器的输出可能会被预测到,导致系统或者 APP 被黑客入侵。
4. 密钥交换 - Key Exchange
密码学定义了密钥交换算法(如 Diffie-Hellman 密钥交换和 ECDH)和密钥构建方案,用于在需要安全传输消息的两方之间安全地构建加密密钥。
这种算法通常在两方之间建立新的安全连接时执行,例如当你打开一个现代 HTTPS 网站或连接到 WiFi 网络时。
5. 混淆与扩散 Confusion and Diffusion
在密码学当中,香农提出的混淆(confusion)与扩散(diffusion)是设计安全密码学算法的两个原则。
混淆使密文和对称加密中密钥的映射关系变得尽可能的复杂,使之难以分析。
如果使用了混淆,那么输出密码中的每个位都应该依赖于密钥和输入数据的多个部分,确保两者无法建立直接映射。
混淆常用的方法是「替换」与「排列」。
「扩散」将明文的统计结构扩散到大量密文中,隐藏明文与密文之间的统计学关系。
使单个明文或密钥位的影响尽可能扩大到更多的密文中去,确保改变输入中的任意一位都应该导致输出中大约一半的位发生变化,反过来改变输出密文的任一位,明文中大约一半的位也必须发生变化。
扩散常用的方法是「置换」。
这两个原则被包含在大多数散列函数、MAC 算法、随机数生成器、对称和非对称密码中。
6. 密码库
开发人员应该了解他们的编程语言和平台的现代密码库以及如何使用它们。
盲目地从 Internet 复制/粘贴代码或遵循博客中的示例可能会导致不安全的设计和弱安全性,曾经安全的代码随着时间的推移也可能变得不再安全,涉及到密码学的代码,一定要谨慎处理!
密码库非常有用,但你应该先了解相关概念,然后选择适当的算法组合并仔细调整其参数。
本系列文章的后续部分,会分别介绍相关概念,并使用 Python 演示其用法,其他语言的写法网上也很容易找到。