Serverpod密码哈希安全升级:应对彩虹表攻击的Argon2Id迁移指南

20 阅读3分钟

CVE-2024-29886:Serverpod提升存储密码哈希的安全性

漏洞详情

包管理平台: Pub

受影响的包: serverpod_auth_server

受影响版本: < 1.2.6

已修复版本: 1.2.6

严重程度: 中等(CVSS评分5.3)

描述

安全性改进

Serverpod现在使用OWASP推荐的Argon2Id密码哈希算法来存储电子邮件认证模块的密码哈希。

从Serverpod 1.2.6开始,所有创建账户或通过服务器进行认证的用户,其密码都将使用更安全的算法进行存储。开发者无需进行任何更改即可开始使用更安全的算法存储密码。

更改密码存储方式的原因

旧密码哈希算法存在一个问题:如果数据库遭到入侵,该算法容易受到彩虹表攻击。

强烈建议迁移现有的密码哈希。

迁移现有密码哈希

电子邮件认证模块提供了一个辅助方法来迁移数据库中所有现有的旧版密码哈希。只需调用Emails.migrateLegacyPasswordHashes(...)方法并传入一个会话实例作为参数,即可迁移密码哈希。

该方法被实现为一个幂等操作,无论调用多少次都会产生相同的结果。

我们建议要么实现一个可以通过远程调用的Web服务器路由,要么在启动服务器时调用该方法。

以下是实现Web服务器路由的示例代码:

Web服务器路由代码

import 'dart:io';

import 'package:serverpod/serverpod.dart';
import 'package:serverpod_auth_server/module.dart' as auth;

class MigratePasswordsRoute extends Route {
  @override
  Future<bool> handleCall(Session session, HttpRequest request) async {
    request.response.writeln(
      'Migrating legacy passwords, check the server logs for progress updates.',
    );
    _migratePasswords(session);
    return true;
  }
}

Future<void> _migratePasswords(Session session) async {
  session.log('Starting to migrate passwords.');

  var totalMigratedPasswords = 0;
  while (true) {
    try {
      var entriesMigrated = await auth.Emails.migrateLegacyPasswordHashes(
        session,
        // 每次处理100个数据库条目
        batchSize: 100,
        // 迁移500个条目后停止
        maxMigratedEntries: 500,
      );

      totalMigratedPasswords += entriesMigrated;
      session.log(
        'Migrated $entriesMigrated password entries, total $totalMigratedPasswords.',
      );

      if (entriesMigrated == 0) break;

      // 延迟以避免数据库过载
      await Future.delayed(Duration(seconds: 1));
    } catch (e) {
      session.log('Error migrating passwords: $e');
    }
  }

  session.log('Finished migrating passwords.');
}

迁移现有密码哈希的工作原理

由于在不知道明文密码的情况下无法重新计算密码哈希,电子邮件认证模块中的方法会将新算法应用于已存储的密码哈希。

当受影响的用户随后进行身份验证时,他们的密码哈希将同时使用两种算法进行计算。如果身份验证被接受,存储的密码哈希将更新为仅使用新算法,以便后续的身份验证只需运行新算法。

影响范围

所有serverpod_auth_server的1.2.6之前版本。

补丁

升级到1.2.6版本可解决此问题。

参考信息

弱点分类

弱点: CWE-916

描述: 使用计算强度不足的密码哈希 产品为密码生成哈希,但使用的方案未提供足够的计算强度,这使得密码破解攻击变得可行或成本低廉。

标识符

  • CVE ID: CVE-2024-29886
  • GHSA ID: GHSA-r75m-26cq-mjxc
  • 源代码: serverpod/serverpod