Контрольные суммы и ключи
Все 17 методов PK для контрольных сумм, обработки паролей, производных ключей, случайных данных и UUID.
Объект PK предоставляет 17 методов этой группы. Быстрые контрольные суммы сравнивают содержимое, парольные функции затрудняют перебор, производные ключи создают ключ заданного размера, а UUID служит только идентификатором. Одинаковый строковый тип результата не делает эти задачи взаимозаменяемыми.
Что выбрать
Сравнить содержимое
sha256, SHA2Hash, SHA3Hash, blake2bEncode и другие контрольные суммы дают одинаковый результат для одинаковых байтов. Секретного ключа в вычислении нет.
Обработать пароль
generatePBKDF2Key, generateScryptKey, bcryptHash и argon2Hash специально расходуют время, а scrypt и Argon2 ещё и память.
Подтвердить общий секрет
blake3Encode в текущем исполнителе работает только с ключом. Отдельного метода HMAC у объекта PK нет; соответствующая функция доступна в in-Line Kit.
Создать метку
UUIDV4 создаёт удобный идентификатор. randomBytes возвращает псевдослучайные числа, но не подходит для секретов.
Функция HMAC и её поддерживаемые алгоритмы разобраны в . Не придумывайте вызов PK.hmac: такого публичного метода нет.
Границы безопасности
Обычная контрольная сумма не подходит для хранения пароля
MD5, SHA, BLAKE, Whirlpool, xxHash и Keccak вычисляются без уникальной соли и слишком быстро для защиты пароля. Для пароля используйте предназначенную функцию, создавайте отдельную случайную соль в защищённом источнике и сохраняйте все параметры проверки вместе с результатом.
Отвечает на вопрос «совпадают ли данные». Любой человек, знающий сообщение, может вычислить тот же результат.
Подтверждает знание общего секрета. Она не шифрует сообщение и не скрывает его содержание.
Создаёт дорогой для перебора результат из пароля и соли. Проверка повторяет вычисление с теми же параметрами, а не расшифровывает строку.
Для методов с объектом параметров передавайте JSON.stringify({...}). Это сохраняет кавычки, обратные косые черты и переводы строк внутри пароля, соли или сообщения и исключает ручное составление JSON.
Простые контрольные суммы
Все четыре метода принимают input: string, не меняют состояние проекта и возвращают шестнадцатеричную строку в нижнем регистре. Примеры используют demo, чтобы результат можно было сверить буквально.
PK.md5(input)
Результат всегда содержит 32 шестнадцатеричных знака. MD5 оставлен для совместимости с внешними договорами и не должен выбираться для новой проверки безопасности. Точная общая операция приведена в .
PK.sha1(input)
Результат всегда содержит 40 шестнадцатеричных знаков. SHA-1 также оставлена только для совместимости. Подробности приведены в .
Настраиваемая SHA-2
PK.SHA2Hash(input)
Принимает строку JSON с текстом, размером SHA-2 и видом результата. Неизвестное или повторяющееся поле возвращает строку ошибки.
input: string — объект с обязательным text; hashSizeBits равен 256, 384 или 512, по умолчанию 256.
outputFormat: hexa, base64, base64url, base32 или bytes; по умолчанию hexa.
string; bytes возвращает строку JSON с массивом целых чисел 0…255.
Шестнадцатеричный результат здесь использует верхний регистр, в отличие от PK.sha256. Вариант base64url сохраняет конечные =. Все размеры и виды результата приведены в .
SHA-3 и XOF
PK.SHA3Hash(input)
Принимает строку JSON. Для обычной SHA-3 укажите type: "sha"; для результата расширяемой длины — type: "xof".
text: string — исходное сообщение в UTF-8.
hashSizeBits: 224, 256, 384 или 512; по умолчанию 256.
hashSizeBits трактуется как число байтов. Значение по умолчанию создаёт 256 байт, а не 256 бит.
outputFormat принимает hexa, base64, base64url или base32. Ошибочно указанное bytes и любое другое значение молча выбирает hexa. Поле version — необязательное целое, по умолчанию 256; оно передаётся движку SHA-3. Значение type приводится к нижнему регистру, после чего только sha включает обычную SHA-3; любое другое значение попадает в ветвь XOF, поэтому проверяйте это поле до вызова. Полный договор приведён в .
Другие контрольные суммы
Следующие четыре метода принимают input: string, вычисляют контрольную сумму текста UTF-8 и не меняют состояние проекта. При внутренней ошибке они возвращают обычную строку с началом Error: .
PK.blake2bEncode(input)
Использует BLAKE2b-256 и возвращает 32 байта как 64 шестнадцатеричных знака.
Точная общая операция приведена в .
PK.whirlpoolEncode(input)
Использует Whirlpool и возвращает 64 байта как 128 шестнадцатеричных знаков.
Точная общая операция приведена в .
PK.XXHashEncode(input)
Использует xxHash32 и возвращает только 4 байта как 8 шестнадцатеричных знаков. Это быстрая контрольная сумма для таблиц, разбиения и обнаружения случайных изменений, а не средство безопасности.
Назначение и размер объяснены в .
PK.keccak256Hash(input)
Использует Keccak-256 и возвращает 32 байта как 64 шестнадцатеричных знака. Keccak-256 и стандартизованная SHA3-256 применяют разные правила дополнения и дают разные результаты.
Отличие от SHA3-256 закреплено в .
Ключевой BLAKE3
PK.blake3Encode(input)
Принимает строку JSON с message и ключом key в шестнадцатеричной форме. Несмотря на необязательность поля при разборе, без ключа исполнитель не создаёт BLAKE3 и возвращает ошибку, поэтому в действующем договоре ключ обязателен.
message: string — текст UTF-8.
key: string — ровно 32 байта, то есть 64 шестнадцатеричных знака.
string — 32 байта в шестнадцатеричной форме либо строка ошибки.
Ключ в примере показывает только форму. Используйте отдельный секрет из защищённого источника и не записывайте его в журнал. Преобразователь не подтверждает, что каждый шестнадцатеричный знак прочитан успешно, поэтому входной ключ должен быть проверен на границе получения. Подробности приведены в .
Пароли и производные ключи
PBKDF2
Совместимый производный ключ. Нагрузка в основном задаётся числом итераций; размер результата указывается в битах.
scrypt
Производный ключ с заметным расходом памяти. Параметры N, r и p должны точно совпадать при повторном вычислении.
BCrypt
Самодостаточная строка пароля с видом алгоритма, стоимостью и солью. Отдельного метода проверки в объекте PK нет.
Argon2
Настраиваемые память, число проходов и параллелизм. Текущий результат не включает соль и параметры, поэтому их нужно хранить отдельно.
Соль не обязана быть секретной, но должна быть отдельной и уникальной для каждого пароля. Не создавайте её через PK.randomBytes: этот метод использует обычный псевдослучайный генератор, не предназначенный для защиты.
PK.generatePBKDF2Key(input)
Создаёт производный ключ PBKDF2 по строке JSON.
text — пароль или исходный материал; salt — соль. Оба поля являются строками.
textEncoding и saltEncoding: utf8/plaintext, hex/hexa или base64; по умолчанию utf8.
keyLength задаётся в битах: от 8 до 8192, кратно восьми, по умолчанию 128. counter: от 1 до 10000000, по умолчанию 10000.
hashFunction: sha1, sha2 или sha3; outputFormat: hex/hexa либо base64.
keyLength: 256 создаёт 32 байта; значение 32 создало бы только 4 байта. Для SHA-1 hashSizeBits равен 160; для SHA-2 и SHA-3 доступны 224, 256, 384, 512. Полный договор приведён в .
PK.generateScryptKey(input)
Создаёт производный ключ scrypt и возвращает его шестнадцатеричную строку.
password, salt, N, r, p. Пароль и соль преобразуются в UTF-8.
outputSize — число байтов, по умолчанию 64; строка результата вдвое длиннее.
Примерная основная память: 128 × N × r байт на один одновременный вызов.
N должна быть степенью двойки больше единицы, r и p — положительными целыми. При N: 16384 и r: 8 один вызов требует примерно 16 МиБ основной памяти. Ошибка разбора обычно возвращает SCrypt error: ..., но часть ошибок вычисления возвращает пустую строку; принимайте только результат ожидаемой шестнадцатеричной длины. Подробности приведены в .
PK.bcryptHash(input)
Создаёт 60-знаковую строку BCrypt. Передавайте объект JSON, чтобы опечатка в структуре не превратила весь аргумент в обычный пароль со стоимостью 10.
text: string — обязательное поле.
cost — целое от 4 до 31, по умолчанию 10; каждый следующий шаг примерно удваивает работу.
Необязательные ровно 16 байт: hex, канонический Base64 с == либо массив чисел 0…255.
Без поля salt каждый вызов создаёт новую соль, поэтому одинаковый пароль обычно даёт разные корректные строки. Не проверяйте пароль сравнением с новым вызовом: нужна проверка BCrypt по сохранённой строке, а отдельного публичного метода проверки у PK нет. Явная соль и точные формы разобраны в .
PK.argon2Hash(input)
Создаёт производный результат Argon2 и возвращает только шестнадцатеричную строку. Соль и параметры в результат не включаются.
password: string и salt: string; оба значения передаются как UTF-8.
iterations по умолчанию 2; memory — 65536 КиБ; parallelism — 1.
type: Argon2d, Argon2i или Argon2id; version: 1.0 или 1.3. По умолчанию Argon2id и 1.3.
outputLength — число байтов, по умолчанию 32. secret и additional являются необязательными строками.
Неизвестное значение type молча выбирает Argon2id, поэтому передавайте одно из трёх точных имён. Значение memory: 65536 требует около 64 МиБ на каждый одновременный вызов. Для последующей проверки сохраняйте точную соль, iterations, memory, parallelism, type, version и outputLength. Полный договор приведён в .
Случайные данные и идентификатор
PK.randomBytes(length)
Возвращает строку JSON с массивом указанной длины. Каждый элемент — целое число от 0 до 255.
length: number — целое число; явной верхней границы нет.
string — массив JSON; длина 0 возвращает [].
Продвигается общее состояние обычного псевдослучайного генератора программы.
randomBytes не является защищённым генератором
Каждый элемент создаётся обычной функцией Random(256). Не используйте результат для паролей, ключей, начальных векторов, секретов доступа, солей и любых других данных безопасности. Слишком большое значение также способно исчерпать память процесса.
Точное поведение исполнителя приведено в .