SRP:安全远程密码协议
了解 SRP 如何让客户端与服务器相互验证身份,同时无需服务器存储密码
SRP:安全远程密码协议 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
SRP 概览与历史
安全远程密码(SRP)协议由斯坦福大学的 Tom Wu 开发,并于 2000 年以 RFC 2945 的形式发布,之后又定义了改进版本 SRP-6a。SRP 可以基于共享密码实现双向认证,同时始终不传输密码本身,即使不会以加密形式传输。
服务器存储验证器,而非密码
在 SRP 注册过程中,客户端计算密码验证器 v = g^x mod N,其中 x = H(salt || password),N 是一个大型安全素数。服务器只存储盐值和验证器 v。即使服务器数据库遭到入侵,存储的验证器也不会直接泄露密码。
SRP 会话密钥生成
在 SRP 登录过程中,客户端和服务器都会执行类似 Diffie-Hellman 的交换,从而生成共享会话密钥。双方的计算都纳入了由密码派生的值,因此只有分别知道密码和验证器的一方,才能正确计算出对应的会话密钥。
SRP 中的双向认证
SRP 提供双向认证:客户端证明自己知道密码,服务器证明自己持有合法验证器。这可以防止仿冒服务器收集密码信息的网络钓鱼攻击,因为没有真正的验证器,仿冒服务器无法正确完成 SRP 交换。
验证器的计算
验证器的计算方式为 v = g^x mod N,其中 x = H(salt || password),g 是生成元,N 是 2048 位或更大的安全素数。离散对数问题使得从 v 中恢复 x 在计算上不可行。只有成功完成完整的 SRP 交换,才能验证密码。
SRP-6a 的改进
SRP-6a 通过引入乘数参数 k = H(N, g),并修改客户端和服务器的计算顺序,解决了原始 SRP-3 和 SRP-6 设计中的弱点。这些变化防止了某些一举两得的猜测攻击,并确保服务器的贡献值在协议早期就完成绑定。
生产系统中的 SRP
SRP 已在现实世界中得到大规模部署。Apple 在 iCloud 钥匙串同步中使用 SRP,使设备能够获取钥匙串数据,而无需向 Apple 的服务器泄露账户密码。1Password 也曾在其认证模型中使用 SRP,以防止服务器端凭据泄露。
SRP 可防止网络钓鱼
由于 SRP 生成的会话密钥同时绑定密码和服务器的验证器,网络钓鱼服务器无法正确完成 SRP 握手。用户通过 SRP 连接到网络钓鱼网站时,认证会失败,因此 SRP 内置了传统密码提交方式所不具备的反网络钓鱼特性。
SRP 的局限性
SRP 的计算成本较高,需要对大型(2048 位以上)整数执行模幂运算。正确实现 SRP 也较为复杂,参数验证中存在许多细微陷阱,已经导致过实现漏洞。此外,该协议还需要安全信道(TLS),以防止交换过程本身遭到被动窃听。
TLS-SRP 密码套件
RFC 5054 定义了 TLS-SRP 密码套件,将 SRP 双向认证直接集成到 TLS 握手中。这样无需服务器证书,仍可提供加密的双向认证。不过,随着 FIDO2 和 OPAQUE 等更现代的替代方案出现,TLS-SRP 在实际中的采用仍然有限。
SRP 与现代替代方案的比较
SRP 虽然具有开创性,但 OPAQUE 等现代替代方案提供了更强的安全保证(抵抗预计算攻击),而 FIDO2/通行密钥则彻底消除了密码。对于新系统,首选 OPAQUE 或 FIDO2;但对于需要基于密码的双向认证且不能存在网络钓鱼漏洞的系统,SRP 仍是有效选择。
SRP 验证器检查
在 SRP 中,服务器存储什么来代替用户的密码?
课程回顾:SRP 认证
SRP 存储密码验证器(而非密码),通过类似 DH 的交换生成共享会话密钥,并提供可抵御网络钓鱼的双向认证。SRP-6a 增强了原始协议对猜测攻击的抵抗能力。Apple 的 iCloud 钥匙串和 1Password 在生产环境中使用 SRP。对于新系统,OPAQUE 和 FIDO2 是现代继任方案。
常见问题解答
「SRP:安全远程密码协议」课时是免费的吗?
是的 — 「SRP:安全远程密码协议」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「SRP:安全远程密码协议」这节课中我会学到什么?
了解 SRP 如何让客户端与服务器相互验证身份,同时无需服务器存储密码 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「SRP:安全远程密码协议」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 密码身份验证的根本问题
- SRP:安全远程密码协议
- PAKE 协议及其属性
- 无密码身份验证:WebAuthn 与 FIDO2