开发者社区> 明俨> 正文

MongoDB中使用的SCRAM-SHA1认证机制

简介: 介绍 SCRAM是密码学中的一种认证机制,全称Salted Challenge Response Authentication Mechanism。 SCRAM适用于使用基于『用户名:密码』这种简单认证模型的连接协议。 SCRAM是一个抽象的机制,在其设计中需要用到一个哈希函数,这个哈希函数是
+关注继续查看

介绍

SCRAM是密码学中的一种认证机制,全称Salted Challenge Response Authentication Mechanism。
SCRAM适用于使用基于『用户名:密码』这种简单认证模型的连接协议。
SCRAM是一个抽象的机制,在其设计中需要用到一个哈希函数,这个哈希函数是客户端和服务端协商好的,包含在具体的机制名称中。比如SCRAM-SHA1,使用SHA1作为其哈希函数。

前言

基于『用户名:密码』这种简单认证模型的协议中,客户端和服务端都知道一个用户名(username)对应一个密码(password)。在不对信道进行加密的前提下,无论是直接使用明文传输『username:password』,还是给password加个哈希的方法都low爆了,很容易被黑客攻击。一个安全性高的认证机制起码应该是具备双向认证的,即:

  1. 服务端需要验证连接上来的客户端知道对应的password
  2. 客户端需要知道这个声称是服务端的人是真正的服务端

我们来看看SCRAM是怎么做的。

初始

  1. 服务端使用一个salt和一个iteration-count,对password进行加盐哈希(使用H表示哈希函数,这里就是SHA1,iteration-count就是哈希迭代次数),得到一个password[s]:

    _password[s] = H(password, salt, iteration-count)_
    
  2. 服务端拿这个password[s]分别和字符串『Client Key』和『Server Key』进行计算HMAC摘要,得到一个key[c]和一个key[s]:

    _key[c] = HMAC(password[s], "Client Key")_
    
    _key[s] = HMAC(password[s], "Server Key")_
    
  3. 服务端保存username、H(key[c])、key[s]、salt和iteration-count,没有保存真正的password

一次认证

  1. 客户端发送client-first-message给服务端,包含username和client-nonce,其中client-nonce是客户端随机生成的字符串
  2. 服务端返回客户端server-first-message,包含salt,iteration-count和client-nonce|server-nonce,其中server-nonce是服务端随机生成的字符串
  3. 客户端发送client-final-message给服务端,包含client-nonce|server-nonce和一个proof[c]。这个proof[c]就是客户端的身份证明。首先构造出这次认证的变量Auth如下:

    _Auth = client-first-message, server-first-message, client-final-message(without proof[c])_
    
    然后使用从服务端获取的salt和iteration-count,根据已知的password计算出加盐哈希password[s],然后根据password[s]得到key[c],再拿这个key[c]和Auth变量经过如下计算得到:
    
    _proof[c] = key[c] XOR HMAC(H(key[c]), Auth)_
  4. 服务端使用其保存的H(key[c])和Auth计算HMAC摘要,再和proof[c]进行异或,得出key[c],再对这个key[c]进行哈希,和其保存的H(key[c])进行比较是否一致。如果一致,则客户端的认证通过,服务端接下来会构造一个proof[s]用来向客户端证明自己是服务端:

    _proof[s] = HMAC(key[s], Auth)_
  5. 客户端使用password[s]得到key[s],然后使用相同算法计算key[s]和Auth的HMAC摘要,验证服务端发送过来的proof[s]是否和计算出来的一致,从而认证服务端的身份。

几个问题

Q:proof[c]为什么不能是和proof[s]一样使用HMAC(key[c], Auth)算得?

A:服务端没有保存key[c],而是保存H(key[c]),这是因为如果服务端的key[c]泄露,那么黑客可以轻易构造出proof[c],从而伪装成客户端了。

Q:那么直接使用HMAC(H(key[c]), Auth)呢?

A:同样,如果服务端的H(key[c])泄露,黑客又可以轻易构造出proof[c],从而伪装成客户端了。因此必须要加上key[c]的异或,从而证明客户端知道key[c]的值。

Q:但是如果服务端的H(Key[c])泄露,再通过网络泄露了proof[c]和Auth,就可以根据proof[c]和HMAC(H(key[c]), Auth)异或得到key[c]了?

A:是的,所以如果要求更高的安全性,还是推荐使用信道加密。

Q:nonce的作用?

A:client-nonce和server-nonce都是随机生成的字符串,这主要是为了每次认证都有个不同的Auth变量,以防止被重放攻击。

安全性分析

分析下以下几种情况下SCRAM的安全性:

  • 网络流量被监听:
    如果某次认证的网络流量被监听,黑客可以拿到salt、iteration-count和Auth,但是无法伪装成服务端,因为没有key[s],无法生成proof[s],完成不了最后一次认证。
  • 服务端被脱裤:如果服务端被脱裤,黑客可以拿到username、H(key[c])、key[s]、salt和iteration-count,但是生成不了key[c],因此无法生成proof[c],不能伪装成客户端。
  • 如果很不幸的网络流量被监听,服务端又被脱裤,那么对不起,被爆菊了,要应对这种情况,只能使用信道加密了。

参考文献

  1. Improved Password-Based Authentication in MongoDB 3.0: SCRAM Explained - Pt. 1
  2. Improved password-based authentication in MongoDB 3.0: SCRAM Explained (Part 2)
  3. 维基百科:Salted Challenge Response Authentication Mechanism
  4. 阿里云MongoDB云服务

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Arthas使用
Arthas使用
47 0
Sharding-Proxy的基本功能使用
Sharding-Proxy是一个分布式数据库中间件,定位为透明化的数据库代理端。作为开发人员可以完全把它当成数据库,而它具体的分片规则在Sharding-Proxy中配置。
1234 0
上线两个月,已有数千人获得 OceanBase 数据库认证!
随着2020接近尾声,OBCA 认证免费报名通道即将关闭,截止日期为12月31日,所有学员都可以登陆OceanBase官网(www.oceanbase.com/training )免费报名参与 OBCA 考试。同时,为了答谢更多对 OBCA 感兴趣的小伙伴们,只要在 12.15日 前完成线上考试报名,即可参与幸运抽奖,快来赢取超多惊喜 OceanBase 定制周边吧!
1891 0
MongoDB Shard部署及Tag的使用
Shard部署 准备测试环境 为准备数据文件夹 Cd  /home/tiansign/fanr/mongodb/Shard mkdir configdb1 configdb2 configdb3 mkdir shard1 shard2 shard3 mkdir mongos 准备配置文...
722 0
+关注
明俨
郑涔,花名明俨,阿里云数据库组高级技术专家,主要关注分布式存储、Nosql数据库等技术领域,目前主要参与MongoDB云数据库的研发,致力于让开发者用上最好的MongoDB云服务
12
文章
10
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
相关文档: 云数据库 OceanBase 版 可信账本数据库 云原生关系型数据库 PolarDB PostgreSQL引擎
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载