MongoDB 5.0 默认强制使用 SCRAM-SHA-256 鉴权并拒绝仅支持 SHA-1 的客户端,而 4.2 默认仍为 SCRAM-SHA-1,虽支持 SHA-256 但需显式指定机制创建用户;5.0 新建用户自动以 SHA-256 存储凭证,旧客户端需升级驱动或临时启用兼容参数。

MongoDB 4.2 和 5.0 的 SCRAM 鉴权机制差异,核心不在“是否支持 SHA-256”,而在于“默认启用的哈希算法版本”和“是否强制要求 SHA-256”。 4.2 默认仍用 SCRAM-SHA-1,5.0 开始默认强制使用 SCRAM-SHA-256,且不再接受仅支持 SHA-1 的旧客户端连接(除非显式降级配置)。
SCRAM-SHA-256 是 5.0 的默认鉴权方式
从 MongoDB 5.0 起,mongod 启动时若未显式指定 --setParameter scramSHA256IterationCount=... 或其他兼容参数,新创建的用户将**自动以 SCRAM-SHA-256 方式存储凭证**。即使你用 4.2 的 db.createUser() 语法创建用户,5.0 实例也会将其升级为 SHA-256 存储(前提是客户端也支持)。这与 4.2 中默认生成 SCRAM-SHA-1 凭证有本质区别。
常见错误现象:Authentication failed. 报错,但用户名密码确认无误——很可能是客户端驱动版本过低(如 pymongo SCRAM-SHA-256 握手流程。
- Python 用户需确保
pymongo >= 3.12(推荐 4.0+) - Node.js 用户需使用
mongodb@4.0+驱动 - Java 用户需用
mongo-java-driver 4.3+或mongodb-driver-sync 4.7+ - 连接字符串中不能含
authMechanism=SCRAM-SHA-1(5.0 默认拒绝该显式声明)
4.2 仍默认用 SCRAM-SHA-1,但可手动启用 SHA-256
MongoDB 4.2 已**支持** SCRAM-SHA-256,但不是默认行为。要启用它,必须在创建用户时显式指定机制:
db.createUser({
user: "admin",
pwd: "xxx",
roles: ["root"],
mechanisms: ["SCRAM-SHA-256"]
})否则,即使你用 4.2 连接 5.0 实例,只要用户是 4.2 创建且未指定 mechanisms,其凭证仍是 SHA-1 格式,5.0 实例会拒绝认证(除非开启兼容模式)。
注意:mechanisms 字段只在创建时生效;后续 db.changeUserPassword() 不会改变已有机制类型。
如何让 5.0 兼容旧 SHA-1 客户端(不推荐)
仅限迁移过渡期临时使用。必须同时满足两个条件:
- 启动
mongod时加参数:--setParameter scramSHA1IterationCount=4096(或更高,但必须显式设) - 用户必须是用
SCRAM-SHA-1创建的(即 4.2 环境下创建,或 5.0 中用mechanisms: ["SCRAM-SHA-1"]显式指定)
但要注意:MongoDB 5.0+ 的 listUsers 命令返回的 mechanisms 字段已不再包含 SCRAM-SHA-1 —— 即使它实际可用,这是为了推动淘汰。一旦依赖此兼容模式,升级到 6.0 将直接中断。
验证当前用户使用的鉴权机制
连接后执行:
db.runCommand({ listUsers: 1, showCredentials: true })查看返回中每个用户的 credentials 字段:"SCRAM-SHA-1" 或 "SCRAM-SHA-256" 是明确标识。不要只看连接字符串里的 authMechanism —— 它可能被忽略或覆盖。
最容易被忽略的一点:驱动版本和服务器版本的机制协商是「双向匹配」。哪怕服务器支持 SHA-256,只要客户端发的是 SHA-1 challenge,5.0 就会拒之门外——而这个过程不会在日志里打印详细原因,默认只记 Authentication failed。


















