Версия:

Модуль crypto

Модуль crypto

Общие сведения

«Crypto» – это сокращенно «криптография», что обычно означает производство значения дайджеста из функции (как правило, криптографической хеш-функции – Cryptographic hash function), примененной к строке. Модуль crypto Tarantool’а поддерживает десять типов криптографических хеш-функций (AES, DES, DSS, MD4, MD5, MDC2, RIPEMD, SHA-0, SHA-1, SHA-2). В модуле Модуль digest также есть некоторые криптографические функции.

Индекс

Ниже приведен перечень всех функций модуля crypto.

Имя Использование
crypto.cipher.{algorithm}.{cipher_mode}.encrypt() Шифрование строки
crypto.cipher.{algorithm}.{cipher_mode}.decrypt() Расшифрование строки
crypto.digest.{algorithm}() Получение дайджеста
crypto.cipher.{aes128|aes192|aes256|des}.{cbc|cfb|ecb|ofb}.encrypt(string, key, initialization_vector)
crypto.cipher.{aes128|aes192|aes256|des}.{cbc|cfb|ecb|ofb}.decrypt(string, key, initialization_vector)

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

  • aes128 - aes-128 (128-битные двоичные строки с использованием AES)
  • aes192 - aes-192 (192-битные двоичные строки с использованием AES)
  • aes256 - aes-256 (256-битные двоичные строки с использованием AES)
  • des - des (56-битные двоичные строки с использованием DES, хотя использование DES не рекомендуется)

Также доступны четыре режима блочного шифрования на выбор:

  • cbc - Сцепление блоков шифротекста
  • cfb - Обратная связь по шифротексту
  • ecb - Электронная кодовая книга
  • ofb - Обратная связь по выходу

Для получения дополнительной информации, см. статью о режимах шифрования Encryption Modes

Пример:

crypto.cipher.aes192.cbc.encrypt('string', 'key', 'initialization')
  crypto.cipher.aes256.ecb.decrypt('string', 'key', 'initialization')
crypto.digest.{dss|dss1|md4|md5|mdc2|ripemd160}(string)
crypto.digest.{sha|sha1|sha224|sha256|sha384|sha512}(string)

Передача или возврат дайджеста из строки. Выбор из двенадцати алгоритмов:

  • dss - dss (с использованием DSS)
  • dss1 - dss (с использованием DSS-1)
  • md4 - md4 (128-битные двоичные строки с использованием MD4)
  • md5 - md5 (128-битные двоичные строки с использованием MD5)
  • mdc2 - mdc2 (с использованием MDC2)
  • ripemd160 - ripemd (160-битные двоичные строки с использованием RIPEMD-160)
  • sha - sha (160-битные двоичные строки с использованием SHA-0)
  • sha1 - sha-1 (160-битные двоичные строки с использованием SHA-1)
  • sha224 - sha-224 (224-битные двоичные строки с использованием SHA-2)
  • sha256 - sha-256 (256-битные двоичные строки с использованием SHA-2)
  • sha384 - sha-384 (384-битные двоичные строки с использованием SHA-2)
  • sha512 - sha-512(512-битные двоичные строки с использованием SHA-2).

Пример:

crypto.digest.md4('string')
  crypto.digest.sha512('string')

Инкрементальные методы в модуле crypto

Предположим, что вычислен дайджест для строки „A“, затем часть „B“ добавляется в строку, необходим новый дайджест. Новый дайджест можно пересчитать для всей строки „AB“, но быстрее будет взять вычисленный дайджест для „A“ и внести изменения на основании добавленной части „B“. Это называется многошаговым процессом или «инкрементным» хеш-суммированием, которое поддерживает Tarantool поддерживает для всех криптографических функций.

crypto = require('crypto')

  -- вывести дайджест 'AB' по aes-192 пошагово, затем с инкрементом
  print(crypto.cipher.aes192.cbc.encrypt('AB', 'key'))
  c = crypto.cipher.aes192.cbc.encrypt.new()
  c:init()
  c:update('A', 'key')
  c:update('B', 'key')
  print(c:result())
  c:free()

  -- вывести дайджест 'AB' по sha-256 пошагово, затем с инкрементом
  print(crypto.digest.sha256('AB'))
  c = crypto.digest.sha256.new()
  c:init()
  c:update('A')
  c:update('B')
  print(c:result())
  c:free()

Получение одинаковых результатов из модулей digest и crypto

Следующие функции равноценны. Например, функция digest и функция crypto приведут к одному результату.

crypto.cipher.aes256.cbc.encrypt('string', 'key') == digest.aes256cbc.encrypt('string', 'key')
  crypto.digest.md4('string') == digest.md4('string')
  crypto.digest.md5('string') == digest.md5('string')
  crypto.digest.sha('string') == digest.sha('string')
  crypto.digest.sha1('string') == digest.sha1('string')
  crypto.digest.sha224('string') == digest.sha224('string')
  crypto.digest.sha256('string') == digest.sha256('string')
  crypto.digest.sha384('string') == digest.sha384('string')
  crypto.digest.sha512('string') == digest.sha512('string')