现代互联网上,绝大多数网站都已经支持 HTTPS,其使用的 SSL/TLS 加密协议会将用户的请求数据与网站的响应进行加密,以防止信息被路径上的恶意用户窃取或篡改。而 SSL/TLS 协议中的一个重要组成部分是 RSA、ECDSA 等非对称加密算法,这些算法的密钥分为公钥、私钥两份,公钥可以公开,而私钥则要妥善保管。
非对称加密算法保证了浏览器和网站交换对称加密密钥的安全,从而保证数据不被窃取或篡改。
但是随着量子计算机的诞生,事情发生了一点变化。在量子计算机上运行的秀尔算法可以非常高效地破解 RSA、ECDSA 等基于质因数分解难度的传统非对称加密算法,只要有一台足够强大的量子计算机,也就是量子比特数目达标的计算机。
而随着量子计算的逐渐火热,量子计算机正在迅速地发展。目前公开的最强大的量子计算机是 IBM 的 53 量子比特计算机,仍然不够使用秀尔算法破解 RSA、ECDSA 等,但高速的科技发展随时可能将此变成现实。
因此,密码学家们着手开发无法被量子计算机有效破解的非对称加密算法,并推广它们的使用,以准备好迎接 RSA 被破解的那一天。
从 2016 年末开始,Open Quantum Safe 就开始将现有的、能抵抗量子计算机的加密算法整合到 liboqs 开发库里,并将它集成到 OpenSSL、BoringSSL 等广泛使用的加密库,以简化新加密算法的部署。
同时,官方还提供了 nginx、Chromium 等软件的编译、集成流程文档。因此,只需要参照文档进行简单的修改,我们就可以准备好迎接实用量子计算机的到来。
这里所有的后量子加密算法都相对较新,并且正在进行 NIST 的标准化审核流程,可能仍有未被发现的漏洞。虽然 Open Quantum Safe 项目有一些方法降低风险,但在这些算法的标准化流程完成之前,不建议将它们用于生产环境等重要用途。
——Lan Tian @ Blog
1. 编译OQS-OpenSSL
由于 nginx 使用 OpenSSL 或 BoringSSL 作为自己的加密库,我们不需要对 nginx 做任何修改,只需要把 OpenSSL 替换成 Open Quantum Safe 项目的版本就可以。
root 权限准备编译环境(以Debian为例):
apt install git cmake
cd /root
git clone -b OQS-OpenSSL_1_1_1-stable https://github.com/open-quantum-safe/openssl.git
git clone -b master https://github.com/open-quantum-safe/liboqs.git
mkdir /liboqs/build && cd /liboqs/build
cmake -DOQS_BUILD_ONLY_LIB=1 -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/root/openssl/oqs ..
make -j4 && make install && cd /root
2.编译Nginx
在常规编译时增加一些参数
./configure \
# 略过一些常规编译参数
--with-openssl=/root/openssl \
--with-cc-opt="-I/root/openssl/oqs/include" \
--with-ld-opt="-L/root/openssl/oqs/lib"
sed -i 's/libcrypto.a/libcrypto.a -loqs/g' objs/Makefile
然后继续正常make即可
3. 使用加密算法
在nginx.conf里添加如下配置:
ssl_ecdh_curve 'p256_frodo640aes:p256_bike1l1cpa:p256_kyber90s512:p256_ntru_hps2048509:p256_lightsaber:p256_sidhp434:p256_sikep434:prime256v1:secp384r1:secp521r1';
完成后重载Nginx即可。
这些密钥交换算法都以 p256_ 开头,意味着后量子加密算法和传统加密算法同时使用。这是为了防止一种情况:新的加密算法存在数学漏洞,使得它们使用传统计算机(冯诺依曼计算机)就可以快速破解。同时使用两种交换算法,既保证了无法被量子计算机破解(如果新加密算法正常工作),也保证了一旦新加密算法被破解,密钥交换数据仍然拥有与传统算法同等级别的保护,不会被传统计算机立即破解。——Lan Tian @ Blog
目前还没有支持量子安全加密算法的CA出现,自签名证书又不被浏览器信任,因此身份验证算法目前还无法真正使用量子安全加密算法。
4. 验证加密算法
使用Chrome等浏览器访问你的网站时会优先使用P-256算法,可以在网站信息里看到。