Serverpod密码哈希安全升级:从脆弱算法迁移至Argon2Id

本文详细介绍了Serverpod身份验证模块中密码哈希存储的安全改进,包括从易受彩虹表攻击的旧算法迁移至OWASP推荐的Argon2Id算法,并提供了具体的迁移代码示例和操作指南。

Serverpod改进存储密码哈希的安全性

漏洞详情

CVE编号:CVE-2024-29886
严重程度:中等
影响版本:serverpod_auth_server < 1.2.6
修复版本:1.2.6

问题描述

Serverpod现在使用OWASP推荐的Argon2Id密码哈希算法来存储电子邮件身份验证模块的密码哈希。从Serverpod 1.2.6开始,所有创建账户或通过服务器进行身份验证的用户都将使用更安全的算法存储密码。开发者无需进行任何更改即可开始使用更安全的算法存储密码。

更改原因

旧密码哈希算法存在一个问题,如果数据库被破坏,容易受到彩虹表攻击。

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

迁移现有密码哈希

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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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版本可解决此问题。

参考信息

安全评分

CVSS总体评分:5.3(中等)

CVSS v3基础指标

  • 攻击向量:网络
  • 攻击复杂度:低
  • 所需权限:无
  • 用户交互:无
  • 范围:未改变
  • 机密性:低
  • 完整性:无
  • 可用性:无

弱点分类

CWE-916:使用计算工作量不足的密码哈希

产品为密码生成哈希,但使用的方案未能提供足够的计算工作量,使得密码破解攻击变得不可行或成本高昂。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计