Реализация mcrypt_rand в Node.js: подробное руководство

В этой статье блога мы рассмотрим различные способы перезаписи функции mcrypt_rand в Node.js. mcrypt_rand — это криптографическая функция, используемая для генерации случайных чисел в расширении PHP mcrypt, которое устарело с версии PHP 7.1. Если вы переносите свою кодовую базу PHP на Node.js, важно понимать, как копировать функциональность mcrypt_rand. Мы рассмотрим несколько подходов на примерах кода, позволяющих добиться этого в Node.js.

Методы реализации mcrypt_rand в Node.js:

  1. Использование модуля шифрования:
    Node.js предоставляет встроенный модуль «криптографии», который предлагает различные криптографические функции. Чтобы генерировать случайные числа, подобные mcrypt_rand, вы можете использовать метод crypto.randomBytes. Вот пример:
const crypto = require('crypto');
function mcrypt_rand(min, max) {
  const range = max - min + 1;
  const bytes = Math.ceil(Math.log2(range) / 8);
  const buffer = crypto.randomBytes(bytes);
  const value = buffer.readUIntBE(0, bytes);
  return min + (value % range);
}
// Usage
const randomNumber = mcrypt_rand(1, 100);
console.log(randomNumber);
  1. Использование пакета Node.js “random-number-csprng”:
    Пакет “random-number-csprng” предоставляет удобный способ генерации криптографически безопасных случайных чисел в Node.js. Вот пример:
const secureRandom = require('random-number-csprng');
async function mcrypt_rand(min, max) {
  const randomNumber = await secureRandom(min, max);
  return randomNumber;
}
// Usage
mcrypt_rand(1, 100)
  .then(randomNumber => console.log(randomNumber))
  .catch(error => console.error(error));
  1. Использование пакета «uuid».
    Пакет «uuid» позволяет генерировать универсально уникальные идентификаторы (UUID) в Node.js. Хотя UUID не совсем эквивалентны случайным числам, в определенных сценариях их можно использовать вместо них. Вот пример:
const { v4: uuidv4 } = require('uuid');
function mcrypt_rand(min, max) {
  const range = max - min + 1;
  const randomNumber = Math.floor(Math.random() * range) + min;
  return uuidv4({ random: [...Array(16)].map(() => randomNumber) });
}
// Usage
const randomNumber = mcrypt_rand(1, 100);
console.log(randomNumber);