Невозможно создать один и тот же дайджест скрипта между реализациями Ruby-s и Go-s

У меня проблема с вычислением одного и того же дайджеста скрипта между RbNaCl и реализация Go.

Вот как я генерирую ключ с помощью rbnacl:

opslimit = 2**20
memlimit = 2**24
digest_size = 32

digest = RbNaCl::PasswordHash.scrypt(
        password,
        salt,
        opslimit,
        memlimit,
        digest_size
)

Значения параметров opslimit и memlimit были найдены на странице документация.

Вот моя попытка воспроизвести те же результаты с Go:

N := 32768
r := 8
p := 1
keyLength := 32

secretKeyBytes, _ := scrypt.Key(password, salt, N, r, p, keyLength)

Значения для N, r, p и keyLength получены из документация.

пароль и соль имеют одинаковые значения.

Я не криптограф, но, насколько я понимаю, должны быть одинаковые значения коэффициента стоимости, чтобы получить один и тот же дайджест? Проблема здесь в том, что, поскольку обе реализации принимают разное количество параметров, мне тоже сложно найти правильную комбинацию. Любые идеи о том, как совместить факторы стоимости между этими двумя реализациями, чтобы я мог вычислять одинаковые хэши scrypt между двумя языками программирования?


person Jarmo Pertman    schedule 22.10.2017    source источник


Ответы (1)


Удалось рассчитать N, p и r из opslimit и memlimit, изучив функция libsodium pickparams, который был вызван crypto_pwhash_scryptsalsa208sha256, который, в свою очередь, был вызван реализацией скрипта Ruby в RbNaCl.

Вот соответствующий код для преобразования opslimit и memlimit в соответствующие N, p и r для использования другими реализациями scrypt, которые предлагают API более низкого уровня для scrypt, если кому-то еще это понадобится в будущем: >https://gist.github.com/jarmo/22f871076ff70e39b54e69c6305c020f

Просто измените значения переменных opslimit и memlimit в main, скомпилируйте их с помощью gcc и запустите, чтобы получить значения для N. , r и p.

В целом проблема заключалась в том, что Go предоставляет API более низкого уровня, чем RbNaCl, хотя они делают одно и то же.

person Jarmo Pertman    schedule 22.10.2017