3. 密码学基础面试题
密码学是网络安全面试中区分度很高的一块。面试官往往不会只问“对称加密和非对称加密有什么区别”,而是会顺着一个实际场景往下追问:HTTPS 握手时到底用了哪种加密、数字签名验的到底是什么、证书链为什么会校验失败。要答得稳,关键是把五组概念串成一条完整的信任链,而不是背定义。
一、对称加密:一把钥匙,两个问题
对称加密的加密与解密使用同一把密钥。它的优势是速度快、适合加密大量数据,AES 是目前的主流算法,常见工作模式有 CBC、CTR、GCM。面试中常被追问的是分组模式的选择:CBC 需要随机且不可预测的 IV,否则相同明文会产生相同密文;GCM 属于带认证的加密模式(AEAD),在保密性之外还提供完整性校验,因此 TLS 1.3 只保留了 AEAD 类算法。
对称加密的两个核心难题是密钥分发和密钥管理。假设 A 和 B 要通信,A 如何把密钥安全地交给 B?如果直接通过网络传,攻击者截获就前功尽弃。这个难题正是非对称加密要解决的。另一个常考细节是:ECB 模式对相同明文块产生相同密文块,会泄露数据结构,经典示例是加密位图后仍能看出轮廓,因此生产环境不应使用 ECB。
二、非对称加密:解决分发,代价是慢
非对称加密使用公钥和私钥一对密钥。公钥可以公开,私钥必须自己保管。RSA 和 ECC 是两类代表:RSA 的安全性基于大整数分解困难,常见密钥长度 2048 位或 4096 位;ECC 基于椭圆曲线离散对数问题,256 位 ECC 的安全强度大致相当于 3072 位 RSA,因此密钥更短、计算更快,在移动端和证书中越来越常见。
非对称加密的运算速度远低于对称加密,通常慢几个数量级,所以它不直接用来加密业务数据,而是用来加密“对称密钥”或做密钥协商。这就引出了混合加密体系:用非对称方式安全地传递一个临时的对称会话密钥,再用对称密钥高速加密实际数据。HTTPS 正是这个思路。面试时如果能主动画出这条链路,通常比单纯罗列算法更加分。
三、哈希:不是加密,是单向指纹
哈希函数把任意长度输入映射为固定长度输出,且不可逆。它不提供保密性,只提供完整性。常见算法有 MD5、SHA-1、SHA-256、SHA-3。MD5 和 SHA-1 已被证明存在实用碰撞攻击,不能用于安全场景,SHA-256 及以上是目前推荐选择。
面试常考的三个性质是:抗碰撞性(找不到两个不同输入产生相同哈希)、抗原像性(由哈希无法反推输入)、雪崩效应(输入改一位,输出约一半比特翻转)。密码存储是高频考点:绝不能明文存密码,也不能只做一次 SHA-256,因为彩虹表和 GPU 暴力破解效率极高。正确做法是使用带盐和慢哈希的算法,例如 bcrypt、scrypt 或 Argon2。下面是一个便于对比的示例参数(属于教学示例,非实测结果):
算法 盐 迭代/成本参数 适用场景
MD5 无 1 已淘汰,禁止用于密码
SHA-256 需加盐 1 完整性校验,不适合直接存密码
bcrypt 内置盐 cost=12 密码存储,约百毫秒级
Argon2id 内置盐 m=64MB,t=3,p=4 密码存储,抗 GPU/ASIC
注意盐的作用是让相同密码产生不同哈希,抵御彩虹表;慢哈希的作用是提高单次验证成本,抵御暴力破解。两者解决的是不同问题,不能互相替代。
四、数字签名:私钥签名,公钥验签
数字签名解决的是身份认证、完整性和不可否认性。它的流程是:发送方先对消息计算哈希,再用自己的私钥加密这个哈希值,得到签名;接收方用发送方公钥解密签名得到哈希,再对收到的消息重新计算哈希,两者一致则验签通过。这里要注意方向:加密用对方公钥,签名用自己私钥,这是面试中极易混淆的点。
实际工程中很少直接对整段消息签名,而是先哈希再签名,因为非对称运算慢,且哈希能把任意长度消息压缩成固定长度。常见签名算法有 RSA-PSS、ECDSA、EdDSA。ECDSA 有一个著名陷阱:签名时使用的随机数 k 必须每次不同且不可预测,否则重复 k 会直接泄露私钥,索尼 PS3 的签名漏洞就是典型案例。
五、PKI:把公钥和身份绑定起来
PKI(公钥基础设施)要解决的问题是:你拿到的公钥,怎么确认它真的属于对方,而不是中间人伪造的?答案是数字证书。证书由 CA(证书颁发机构)签发,内容包含主体身份、公钥、有效期、用途扩展等,并由 CA 用私钥签名。浏览器内置了受信任根证书列表,通过证书链逐级验证:站点证书 → 中间 CA → 根 CA。
验证证书时通常要检查:签名是否有效、是否在有效期内、域名是否匹配、是否被吊销(CRL 或 OCSP)、证书用途是否允许当前场景。面试中常问“自签名证书为什么浏览器报警”,答案就是它不在受信任根列表中,无法建立信任链。另一个高频问题是证书链不完整:服务器只发了站点证书而没发中间证书,部分客户端能靠缓存补全,部分则直接失败,排查时可用 openssl 查看:
openssl s_client -connect example.com:443 -showcerts
# 观察输出中的 Certificate chain 段
# 若只有 1 张证书且非自签名,通常说明中间证书缺失
六、把知识落到面试场景
面对“HTTPS 为什么既用对称又用非对称”这类问题,可以按这条主线回答:客户端发起握手,服务器返回证书;客户端验证证书链并取出服务器公钥;双方通过密钥交换(如 ECDHE)协商出会话密钥;之后所有应用数据用对称加密(如 AES-GCM)传输。非对称负责身份认证和密钥协商,对称负责数据加密,哈希和签名负责完整性,PKI 负责信任锚点。四者各司其职,缺一不可。
最后给出一份面试自检清单,可用于考前快速复盘:能否说清对称与非对称的分工与代价;能否解释哈希为何不能存密码、盐和慢哈希各解决什么;能否准确说出签名用私钥、验签用公钥;能否描述证书链验证的完整步骤;能否指出 ECB、MD5、SHA-1、静态 RSA 密钥交换等已淘汰用法。把这五点讲透,密码学部分的面试基本就稳了。