给工程师的实用密码学

1,140 阅读5分钟

作为工程师可能多多少少,都接触过一些密码学知识. 例如加密一个文件, 加密一个字符串等等. 密码学就在身边, 进入Blockchain领域已经快两年了, 从刚开始什么也不知道, 到现在稍微知道一点东西, 越来越觉得密码学真实有趣和奇妙,所以想把自己的一些学习的知识整理一下, 记录下来. 为自己所用, 同时如果可以帮助更多的人那是更好.

密码学 - Overview

密码学是一门古老的科学, 有上千年的历史但是一直在不断的演进. 各种算法也在不短的演进从MD5,DES 到 AES, SHA-3,Argon2, ChaCha20.

首先对于工程师而言有那些密码学的概念需要了解的呢? 总结下来可能有这几类: (1) hash function(例如SHA-256, SHA-3, RIPEMD等等).(2)HMAC(hash based message authentication code), (3) password to key derivation function (密码key提取函数, 例如Scrypt) (4) Diffie-Hellman 密钥交换协议. (5)对称加密算法(例如AES) (6) 非对称加密算法(RSA, ECC) (7)数字签名.同时还有安全的随机数生成器等等. 以上的这些领域大概就是作为开发工程师需要了解的一些密码学知识和领域了.

密码学是什么

密码学是一门安静安全的传输和保存数据的科学. 当你打开了一个网站, 发一封邮件, 连接上家里的wifi,这些都离不开密码学, 他一直存在我们的数字世界里.这也是为什么, 作为数字世界的创造者的工程师们应该对于密码学有基本的了解, 并且知道如何正确使用这些密码学算法, 密码学的library. 这里就包括hashing, 同步异步加密算法, 数字签名等等.

加密与密钥

密码学要解决的一个重要问题就是如何安全的存储的加密数据. 自然而然这里就涉及到加密和解密了. 具体的来说可以分为对称加密和非对称加密. 对称加密算法例如(AES, ChaCha20)使用的是同一把密钥来加解密数据, 而非对称加密例如公私钥体系是使用的公钥和私钥这一对密钥对, 其实公钥用来加密, 私钥用来解密.常用的加密算法往往多是多种加密方式的组合例如(AES-256-CTR-HMAC-SHA-256, ChaCha20-Poly1305)

还有, 密码学中的密钥在很多场景地下都是通过例如password, passphrases通过私钥衍生函数衍生而来的例如(PBKDF2 and Scrypt)

数字签名和消息验证

现代密码学的另一大应用领域就是数字签名和消息验证.大多数的数字签名算法例如(DSA, ECDSA 和 EdSDA)使用的是非对称加密算法来进行签名, 使用私钥对消息进行签名, 使用公钥验证签名. 在银行系统中, 数字签名被用于签署和批准交易. 在区块链系统中, 数字签名用于转移数字资产从一个地址到另外一个地址.

现代密码学同时使用消息验证算法例如(HMAC)来证明消息的真实性, 完整性以及消息的所有权.同时消息验证也同时会和加密算法同时使用,用于建立安全的通讯渠道.

安全的随机数

随机数在密码学中用非常重要的作用, 如何安全的产生随机数是开发者, 工程师非常需要注意的问题, 一旦随机数的生成有问题那么会威胁到系统的安全性和正确性.

密钥交换

密钥交换算法,用于多方在一个不可信的欢迎下建立安全通讯的方法. 在我们打开一个网站的时候, 建立一个wifi连接的时候密钥交换就自然发生了.虽然我们意识不到, 但是这些方法每天都在发生.

Hash函数和密码Hasing

密码学为我们提供了哈希函数(例如SHA-3 和BLACK2), 哈希函数可以将消息转化为定长的消息片段, 同时这个过程是不可逆的. 在区块链系统中,我们使用哈希函数去生成区块链地址, 交易ID. 在其他系统中, 例如我们每天使用的git中, 哈希函数对于文件和提交生成唯一的ID.

密钥Hashing 和 密码密钥衍生函数 用于包含用户密码和用户加密后的文件, 密码和随机加入的盐用于生成加密文件, 使得破解这些加密的文件变得非常的困难.

密码学的library

工程师和开发者应该理解和了解自己使用的语言, 平台下的密码学的类库, 并且需要理解基本的密码学原理来合理的使用这些类库. 开发者每天面对的应用场景各自不同, 所有就应该首先理解并了解密码学的基本原理, 然后合理的选择密码学的类库.

OK, 以上就是一些基本的密码学的介绍和密码学使用的场景和方向, 后边会逐步的展开介绍这些方面.