diff --git a/services/iam-service-net/src/IamService.Infrastructure/TwoFactor/TotpTwoFactorService.cs b/services/iam-service-net/src/IamService.Infrastructure/TwoFactor/TotpTwoFactorService.cs index 26b5adff..fc357339 100644 --- a/services/iam-service-net/src/IamService.Infrastructure/TwoFactor/TotpTwoFactorService.cs +++ b/services/iam-service-net/src/IamService.Infrastructure/TwoFactor/TotpTwoFactorService.cs @@ -102,19 +102,30 @@ public class TotpTwoFactorService : ITwoFactorService for (int i = 0; i < count; i++) { - // EN: Generate 8 character alphanumeric recovery code - // VI: Tạo mã khôi phục 8 ký tự chữ và số - var bytes = RandomNumberGenerator.GetBytes(6); + // EN: Generate 12 bytes to ensure enough characters after base64 conversion + // VI: Tạo 12 bytes để đảm bảo đủ ký tự sau khi chuyển đổi base64 + var bytes = RandomNumberGenerator.GetBytes(12); var code = Convert.ToBase64String(bytes) - .Replace("+", "") - .Replace("/", "") + .Replace("+", "X") + .Replace("/", "Y") .Replace("=", "") - .Substring(0, 8) .ToUpperInvariant(); - // EN: Format as XXXX-XXXX for readability - // VI: Format thành XXXX-XXXX để dễ đọc - codes.Add($"{code.Substring(0, 4)}-{code.Substring(4, 4)}"); + // EN: Take first 8 characters, ensure we have enough + // VI: Lấy 8 ký tự đầu tiên, đảm bảo có đủ + if (code.Length >= 8) + { + // EN: Format as XXXX-XXXX for readability + // VI: Format thành XXXX-XXXX để dễ đọc + codes.Add($"{code.Substring(0, 4)}-{code.Substring(4, 4)}"); + } + else + { + // EN: Fallback - pad if necessary + // VI: Fallback - pad nếu cần + code = code.PadRight(8, 'Z'); + codes.Add($"{code.Substring(0, 4)}-{code.Substring(4, 4)}"); + } } return codes;