Метод isHashed: определение, является ли строка хешем

Метод isHashed в библиотеке password-hash предназначен для проверки строки на соответствие формату криптографического хеша пароля. Его задача заключается не в криптографической верификации, а в структурном и синтаксическом анализе строки для определения, была ли она получена в результате хеширования.

Общая концепция проверки хеша

Хеши паролей обладают характерными признаками, которые отличают их от обычного текста:

  • фиксированная или стандартизированная структура;
  • наличие служебных маркеров алгоритма;
  • использование ограниченного набора символов;
  • высокая энтропия;
  • отсутствие читаемых слов и смысловой структуры.

Метод isHashed анализирует строку по совокупности этих признаков и делает вывод о вероятной принадлежности к хешированным данным.

Поддерживаемые форматы хешей

В современных реализациях password-hash учитываются наиболее распространённые алгоритмы:

  • bcrypt
  • argon2 (argon2i, argon2d, argon2id)
  • scrypt
  • pbkdf2 (в различных кодировках)
  • sha-based salted hashes (реже, как legacy-формат)

Каждый формат имеет собственную структуру, которую можно определить по шаблону строки.

Примеры характерных префиксов

  • bcrypt: $2a$, $2b$, $2y$
  • argon2: $argon2i$, $argon2d$, $argon2id$
  • scrypt: часто кастомные схемы с метаданными параметров
  • pbkdf2: может содержать pbkdf2 в явном виде или быть сериализованным

Внутренняя логика метода isHashed

Алгоритм проверки обычно строится как последовательность эвристик:

1. Проверка длины строки

Хеши имеют минимальную длину, обусловленную параметрами соли и выходного значения. Короткие строки автоматически исключаются.

2. Анализ допустимых символов

Большинство хешей используют:

  • Base64
  • Base58
  • hexadecimal encoding

Недопустимые символы (например, пробелы или кириллица) чаще всего означают, что строка не является хешем.

3. Проверка структуры

Используются регулярные выражения, соответствующие известным форматам:

const bcryptPattern = /^\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}$/;
const argon2Pattern = /^\$argon2(id|i|d)\$/;

Если строка соответствует одному из шаблонов, она классифицируется как хеш.

4. Проверка наличия параметров алгоритма

Некоторые форматы содержат встроенные параметры:

  • количество итераций
  • memory cost
  • salt
  • parallelism

Наличие подобных метаданных усиливает вероятность положительного результата.

5. Оценка энтропии

Дополнительный этап включает статистическую оценку распределения символов. Хеши характеризуются равномерным распределением, в отличие от текстовых данных.

Поведение метода isHashed

Типичная сигнатура:

isHashed(value: string): boolean

Возвращаемое значение:

  • true — строка соответствует одному из поддерживаемых форматов хешей
  • false — строка не обладает признаками хешированного значения

Метод не гарантирует криптографическую достоверность, поскольку работает на уровне синтаксического анализа.

Примеры анализа строк

Пример bcrypt

$2b$12$KIXQe1Y9m0rQ1qvY8eXxOu3c1a2b3c4d5e6f7g8h9i0j1k2l3m4n5

Строка соответствует:

  • префиксу bcrypt
  • корректной длине
  • допустимому алфавиту

Результат: true

Пример случайного текста

password123

Отсутствуют признаки структуры хеша, высокая семантическая читаемость.

Результат: false

Пример argon2

$argon2id$v=19$m=65536,t=3,p=4$Wm9s...$k9d8s7d6s5d4s3d2s1

Наличие параметров алгоритма и сегментов соли и хеша указывает на валидный формат.

Результат: true

Ограничения метода

Несмотря на высокую точность эвристик, существуют ограничения:

  • кастомные форматы хеширования могут не распознаваться;
  • усечённые или повреждённые строки могут давать ложные результаты;
  • некоторые токены (например, API-ключи) могут иметь схожую структуру;
  • отсутствие строгой криптографической проверки.

Использование регулярных выражений

Основной механизм реализации опирается на набор шаблонов:

const patterns = [
  /^\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}$/,
  /^\$argon2(id|i|d)\$/,
  /^[a-f0-9]{32,}$/i
];

Проверка осуществляется итеративно:

function isHashed(str) {
  if (typeof str !== 'string') return false;

  return patterns.some((pattern) => pattern.test(str));
}

Роль метода в системе password-hash

Метод isHashed используется как вспомогательный компонент в более крупных процессах:

  • предотвращение повторного хеширования уже обработанных значений;
  • валидация данных перед операциями сравнения;
  • фильтрация входных значений в системах аутентификации;
  • диагностика состояния базы данных пользователей.

Поведенческие особенности при граничных значениях

Некоторые строки находятся в «серой зоне»:

  • base64-подобные токены без контекста;
  • UUID с расширенной кодировкой;
  • токены с префиксами сервисов безопасности.

В таких случаях решение принимается на основе совокупности факторов, а не одного признака.

Эвристический характер проверки

Метод не выполняет декодирование и не обращается к криптографическим функциям. Его работа основана на вероятностной модели классификации строк, где учитываются:

  • синтаксическая структура;
  • статистика символов;
  • соответствие известным стандартам;
  • наличие метаданных алгоритма.

Такой подход обеспечивает высокую скорость работы при допустимом уровне ошибок в редких нестандартных случаях.