本文介绍 TencentOS Server 中常用的加密与签名技术,包括磁盘分区加密、文件加解密、数字签名与验签等操作,帮助您保护数据的机密性与完整性。
加密磁盘分区
基本概念
磁盘加密是一种保护数据安全的技术,通过对磁盘上的数据进行加密,确保未经授权的用户无法访问,有助于防止数据泄露。磁盘加密可以应用于整个磁盘(全盘加密)或特定的分区(分区加密)。
LUKS(Linux Unified Key Setup):块设备加密的规范,为数据建立磁盘格式,以及密码/密钥管理策略。LUKS 通过
dm-crypt 模块使用内核设备映射器子系统,提供了一个处理设备数据加密和解密的低级映射。cryptsetup:一个分区加密工具,通过调用内核中的
dm-crypt 来实现磁盘加密的功能。创建加密磁盘
警告:由于创建加密磁盘需要对磁盘分区进行格式化操作,会清空整个磁盘分区的内容,请您提前做好数据备份。
安装分区工具:
dnf install cryptsetup
创建虚拟磁盘
创建虚拟磁盘对 LVM 逻辑卷进行加密;如果使用 LUKS 对物理分区进行加密,可以直接跳过当前步骤。
使用
dd 命令创建一个文件,该文件位于 /tmp/my_virtual_disk.img,大小为 1GB(1024MB)。dd if=/dev/zero of=/tmp/my_virtual_disk.img bs=1M count=1024
对磁盘进行 LUKS 加密:
cryptsetup luksFormat /tmp/my_virtual_disk.img
打开加密分区并创建映射到
/dev/mapper/my_encrypted_volume:cryptsetup luksOpen /tmp/my_virtual_disk.img my_encrypted_volume
格式化映射分区:
mkfs.ext4 /dev/mapper/my_encrypted_volume
创建挂载点并挂载分区:
mkdir /mnt/my_encrypted_volumemount /dev/mapper/my_encrypted_volume /mnt/my_encrypted_volume
查看加密盘状态
sudo cryptsetup status my_encrypted_volume
输出示例:
/dev/mapper/my_encrypted_volume is active and is in use.type: LUKS2cipher: aes-xts-plain64keysize: 512 bitskey location: keyringdevice: /dev/loop0loop: /tmp/my_virtual_disk.imgsector size: 4096offset: 32768 sectorssize: 2064384 sectorsmode: read/write
卸载并关闭分区:
umount /mnt/my_encrypted_volumecryptsetup luksClose /dev/mapper/my_encrypted_volume
加密文件
文件加密是一种将文件内容转换为无法读取的形式的技术,以保护文件的机密性和安全性。通过使用加密算法,可以将原始文件转换为密文,使得除了授权的用户外,其他人无法读取文件内容。
文件加密通常使用对称加密或公钥加密算法。对称加密算法使用相同的密钥来加密和解密数据,因此需要确保密钥的安全性。公钥加密算法使用一对密钥(公钥和私钥),其中公钥用于加密数据,而私钥用于解密数据。由于公钥可以公开,因此公钥加密算法更安全。
文件加密可以用于保护各种类型的文件,包括文本文件、图像文件、音频文件和视频文件等。加密文件可以防止未经授权的访问和窃取,从而保护个人隐私和商业机密。
OpenSSL 是一个功能完备的密码学函数库,不但提供了编程用的 API 函数,还提供了强大的命令行工具,可以通过命令来进行常用的加解密、签名验签、证书操作等功能。本节以
openssl 命令行的形式,介绍一下如何加解密文件。OpenSSL 介绍
OpenSSL 采用 C 语言作为开发语言,使得 OpenSSL 具有优秀的跨平台性能,可以在不同的平台使用。OpenSSL 支持 Linux、Windows、BSD、Mac 等平台,具有广泛的适用性。
OpenSSL 实现了多种对称加密算法(AES、DES、Blowfish、CAST、IDEA、RC2、RC4、RC5)、4 种非对称加密算法(DH 算法、RSA 算法、DSA 算法、椭圆曲线算法(ECC))、多种信息摘要算法(MD2、MD5、MDC2、SHA1 和 RIPEMD)以及密钥及证书管理。OpenSSL 的 license(许可证)是 SSLeay license 和 OpenSSL license 的结合,这两种 license 实际上都是 BSD 类型的 license,依照 license 里面的说明,OpenSSL 可以被用作各种商业、非商业的用途。
OpenSSL 整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL 协议库以及应用程序。
说明:
TencentOS Server 4 默认搭载 OpenSSL 3.x,相比 1.x 版本,3.x 采用了 Provider 架构,性能与安全性均有显著提升。
利用 OpenSSL 加密文件
对称加密算法
对称加密算法通常在需要加密大量数据时使用,双方使用同样的密钥进行加密和解密。对称算法的优点是算法公开、计算量小、加密速度快、加密效率高。对称算法的缺点是产生的密钥过多和密钥分发困难。
常用的对称算法有 DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES 以及国家密码局颁布的 SM1 和 SM4 算法。
显示当前
openssl 的版本:openssl version
输出示例(TencentOS Server 4):
OpenSSL 3.0.12 24 Oct 2023 (Library: OpenSSL 3.0.12 24 Oct 2023)
显示系统支持的对称加密算法:
openssl enc -list
输出示例:
-aes-128-cbc -aes-128-cfb -aes-128-cfb1-aes-128-cfb8 -aes-128-ctr -aes-128-ecb-aes-128-ofb -aes-192-cbc -aes-192-cfb-aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr..........-sm4 -sm4-cbc -sm4-cfb-sm4-ctr -sm4-ecb -sm4-ofb
以
-aes-128-cbc 为例,来说明该参数的具体含义:aes:表示使用 AES 对称加密算法,是一种加密算法名称。OpenSSL 一共提供了 9 种对称加密算法,其中 8 种是分组加密算法,仅有一种流加密算法是 RC4。8 种分组加密算法分别是 AES、DES、Blowfish、CAST、IDEA、RC2/5、SEED、Camellia。128:表示 128 位密钥长度。cbc:表示分组密码加密模式,常见模式有电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)。使用 AES-256-CBC 算法进行文件的对称加解密,使用用户输入密码的形式进行加密:
# 该命令需要用户输入密码# -pbkdf2:表示使用 PBKDF2(Password-Based Key Derivation Function 2)算法进行密钥派生# -in file.txt:表示要加密的明文文件# -out file.enc:表示加密后的密文文件openssl enc -aes-256-cbc -pbkdf2 -in file.txt -out file.enc
执行后会提示输入密码:
enter aes-256-cbc encryption password:Verifying - enter aes-256-cbc encryption password:
使用相同的用户密码,进行解密:
openssl enc -aes-256-cbc -pbkdf2 -d -in file.enc -out file.txt -pass pass:<password>
直接使用密钥进行文件的对称加密:
# 生成 256 位的 AES 密钥openssl rand -base64 32 > mykey.txt# 使用密钥进行对称加密openssl enc -aes-256-cbc -pbkdf2 -in file.txt -out file.enc -pass file:mykey.txt# 使用相同的密钥进行解密openssl enc -aes-256-cbc -d -pbkdf2 -in file.enc -out plaintext.txt -pass file:mykey.txt
使用国密算法 SM4 进行对称加解密。
加密,其中
-K 选项指定加密使用的密钥,-iv 选项指定加密使用的初始向量:openssl enc -sm4 -in file.txt -K <32位十六进制密钥> -iv <32位十六进制IV> -out file.enc
解密,需要使用相同的密钥和初始向量:
openssl enc -d -sm4 -in file.enc -K <32位十六进制密钥> -iv <32位十六进制IV> -out file.raw
非对称加密算法
OpenSSL 一共实现了 4 种非对称加密算法,包括 DH 算法、RSA 算法、DSA 算法和椭圆曲线算法(ECC)。DH 算法一般用于密钥交换。RSA 算法既可以用于密钥交换,也可以用于数字签名,如果您能够忍受其缓慢的速度,那么也可以用于数据加解密。DSA 算法一般只用于数字签名。
这里我们使用 RSA 算法和椭圆曲线算法(ECC)尝试进行文件的加解密。
RSA 进行文件的加解密
1. 使用
genrsa 子命令生成密钥对,密钥对是一个文件:# 生成的密钥长度是 2048 比特openssl genrsa -out mykey.pem 2048
输出示例:
Generating RSA private key, 2048 bit long modulus (2 primes)..................+++++.+++++e is 65537 (0x010001)
2. 从密钥对中分离出公钥:
openssl rsa -in mykey.pem -pubout -out mypubkey.pem
输出示例:
writing RSA key
3. 显示公钥信息:
openssl rsa -pubin -in mypubkey.pem -text
4. 加密命令:
openssl pkeyutl -encrypt -in plaintext.txt -inkey mypubkey.pem -pubin -out ciphertext.txt
其中,
plaintext.txt 是待加密的明文文件,mypubkey.pem 是公钥文件,ciphertext.txt 是加密后的密文文件。5. 解密命令:
openssl pkeyutl -decrypt -in ciphertext.txt -inkey mykey.pem -out plaintext.txt
其中,
ciphertext.txt 是加密后的密文文件,mykey.pem 是私钥文件,plaintext.txt 是解密后的明文文件。国密 SM2 进行文件的加解密
SM2 是基于椭圆曲线密码(ECC)的非对称加密算法,由国家密码管理局颁布。
1. 生成 SM2 密钥对:
openssl ecparam -genkey -name SM2 -out sm2.pem
2. 提取 SM2 公钥:
openssl ec -in sm2.pem -pubout -out sm2.pub.pem
输出示例:
read EC keywriting EC key
3. SM2 加密:
openssl pkeyutl -encrypt -in plaintext.txt -inkey sm2.pub.pem -pubin -out ciphertext.txt
其中,
plaintext.txt 是明文文件,ciphertext.txt 是加密后的密文文件。4. SM2 解密:
openssl pkeyutl -decrypt -in ciphertext.txt -inkey sm2.pem -out plaintext.txt
其中,
ciphertext.txt 是密文文件,plaintext.txt 是解密后的明文文件。签名与验签
数字签名是公钥密码学发展过程中衍生出的一种安全认证技术,主要用于提供实体认证、认证密钥传输和认证密钥协商等服务。简单来说,发送消息的一方可以通过添加一个起签名作用的编码来代表消息文件的特征,如果文件发生了改变,那么对应的数字签名也要发生改变,即不同的文件经过编码所得到的数字签名是不同的。使用基于 RSA 公钥算法的数字签名技术,如果密码攻击者试图对原始消息进行篡改和冒充等非法操作,由于无法获取消息发送方的私钥,因此也就无法得到正确的数字签名,若消息的接收方试图否认和伪造数字签名,则公证方可以用正确的数字签名对消息进行验证,判断消息是否来源于发送方,这样的方式很好地保证了消息文件的完整性、鉴定发送者身份的真实性与不可否认性。
数字签名技术可以分为以下几种:
RSA 数字签名:RSA 是最早的数字签名算法之一,它使用 RSA 密钥对进行数字签名和验证。RSA 数字签名算法具有较高的安全性和可靠性,但是计算复杂度较高,不适合用于大规模数据的签名和验证。
DSA 数字签名:DSA 是一种基于离散对数问题的数字签名算法,它使用 DSA 密钥对进行数字签名和验证。DSA 数字签名算法具有较高的安全性和较快的计算速度,适合用于大规模数据的签名和验证。
ECDSA 数字签名:ECDSA 是一种基于椭圆曲线的数字签名算法,它使用 ECC 密钥对进行数字签名和验证。ECDSA 数字签名算法具有较高的安全性和较快的计算速度,适合用于大规模数据的签名和验证。
数字签名的流程
签名生成流程:发送方使用自己的私钥对消息进行签名。
签名验证流程:接收方使用发送方的公钥对签名进行验证。
本节依旧以
openssl 为例完成数字签名和验签。RSA 数字签名
1. 生成一个 RSA 密钥对,密钥长度 2048 比特:
openssl genrsa -out rsaprivatekey.pem 2048
2. 从密钥对中分离出公钥:
openssl rsa -in rsaprivatekey.pem -pubout -out rsapublickey.pem
3. 对
plain.txt 文件使用 SHA-256 摘要算法和签名算法生成签名文件 signature.txt:echo "hello" >> plain.txtopenssl dgst -sha256 -sign rsaprivatekey.pem -out signature.txt plain.txt
4. 用相同的摘要算法和签名算法校验签名文件,需要对比签名文件和原始文件:
openssl dgst -sha256 -verify rsapublickey.pem -signature signature.txt plain.txt
验证成功时的输出:
Verified OK
DSA 数字签名
1. 生成参数文件和密钥对文件
1. 生成参数文件,类似于 DH 参数文件(DH 参数文件是包含 Diffie-Hellman 密钥交换算法所需参数的文件):
openssl dsaparam -out dsaparam.pem 1024
2. 通过参数文件生成密钥对
dsaprivatekey.pem:openssl gendsa -out dsaprivatekey.pem dsaparam.pem
3. 对私钥对文件使用 DES3 算法进行加密:
openssl gendsa -out dsaprivatekey2.pem -des3 dsaparam.pem
输出示例:
Generating DSA key, 1024 bitsEnter PEM pass phrase:Verifying - Enter PEM pass phrase:
4. 通过密钥对文件拆分出公钥:
openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem
2. 生成和验证签名
echo "hello" > plain.txt# 进行签名,查看 signature.txt 可以发现有原始信息openssl dgst -sha256 -sign dsaprivatekey.pem -out signature.txt plain.txt# 验证签名openssl dgst -sha256 -verify dsapublickey.pem -signature signature.txt plain.txt
验证成功时的输出:
Verified OK
基于国密的 ECDSA 数字签名(SM2)
SM2 签名使用 SM3 摘要算法作为默认哈希。在 OpenSSL 3.x 中,SM2 签名和验签需要通过
-rawin 参数或 SM2 签名上下文来指定摘要算法。1. 生成 SM2 密钥对
直接生成 SM2 私钥,无需预先生成 ECC 参数文件:
openssl ecparam -genkey -name SM2 -out priv.key
2. 拆分密钥获取公钥
# 生成私钥对应的公钥openssl ec -in priv.key -pubout -out pub.key
输出示例:
read EC keywriting EC key
显示公钥信息:
openssl ec -in pub.key -pubin -text -noout
3. SM2 签名
使用 SM2 算法对文件进行签名。在 OpenSSL 3.x 中,需要使用
-rawin -sm3 指定原始输入和 SM3 摘要:# 准备待签名文件echo "hello" > plain.txt# 使用 SM2 私钥对文件签名,采用 SM3 摘要算法openssl pkeyutl -sign -in plain.txt -inkey priv.key -out signature.txt -rawin -digest sm3
4. SM2 验签
使用 SM2 公钥验证签名:
openssl pkeyutl -verify -in plain.txt -inkey pub.key -pubin -rawin -digest sm3 -sigfile signature.txt
验证成功时的输出:
Signature Verified Successfully
证书操作简介
OpenSSL 提供了完整的 X.509 证书管理功能,包括证书签发、查看、验证、转换等操作。
1. 生成自签名证书
# 生成私钥和自签名证书,有效期为 365 天openssl req -x509 -newkey rsa:2048 -keyout cakey.pem -out cacert.pem -days 365 -nodes
2. 查看证书信息
# 查看证书详细信息openssl x509 -in cacert.pem -text -noout# 查看证书的公钥openssl x509 -in cacert.pem -pubkey -noout
3. 证书格式转换
# PEM 格式转换为 DER 格式openssl x509 -in cacert.pem -outform DER -out cacert.der# DER 格式转换为 PEM 格式openssl x509 -in cacert.der -inform DER -outform PEM -out cacert.pem
4. 使用 SM2 生成自签名证书
在 OpenSSL 3.x 中,可以使用 SM2 算法签发证书:
# 生成 SM2 私钥openssl ecparam -genkey -name SM2 -out sm2key.pem# 使用 SM2 私钥生成自签名证书(需配合 SM3 摘要)openssl req -new -x509 -key sm2key.pem -out sm2cert.pem -days 365 -sm3 -nodes