dchest / scrypt-async-js

Fast "async" scrypt implementation in JavaScript
http://dchest.github.io/scrypt-async-js/
BSD 2-Clause "Simplified" License
139 stars 26 forks source link

[RESEARCH] Результат в переменную #1

Closed sergeevabc closed 9 years ago

sergeevabc commented 9 years ago

Дмитрий, я прям теряюсь при знакомстве с вашими инструментами. :) Сейчас вот гадал, чего это Scrypt не работает.

var result = scrypt(masterkey, salt, cost, blocksize, dklen, step, null, "hex"); object is not a function

var result = scrypt(masterkey, salt, cost, blocksize, dklen, step, function(){}, "hex"); undefined

scrypt(masterkey, salt, cost, blocksize, dklen, step, function(res){document.getElementById("result").value = res;}, "hex"); ура, получилось

Главный вопрос: можно ли допилить scrypt, чтобы привычно получать результат в переменную? Или, может быть, я придерживаюсь устаревшей практики, тогда подскажите, как грамотнее.

Второстепенный: если вместо hex указать null, то приходят числа через запятую, примерно так 223,167,126,190,189,229,104,254,42,238,248,65,167,36,135,41,113,133,212,189,192,108,199,187,160,239,56,7,100,124,89,143, а что это? Ожидал неразберихи, которую можно сконвертировать по своему вкусу, необязательно в hex или base64 (например, в base85 zeromq, где спецсимволов больше или в base32/58, где спецсимволы отсутствуют).

P.S. Приятно, что сюда вы включили перевод строки в UTF8, т.е. masterkey, salt пишу без обёртки.

dchest commented 9 years ago

Как и все асинхронное в JavaScript, нужно писать продолжение кода в коллбеке:

scrypt(masterkey, salt, N, r, dkLen, step, function(result) {

    // тут дальнейшие манипуляции с result и остальной код.

}, "hex");

Если null, выдаст Array с байтами.

sergeevabc commented 9 years ago

Как я понимаю, здешний коллбек относится к тому, что делать после подсчёта результата. А возможен коллбек о статусе операции? См. у Amandam, OneShallPass и Triplesec. Так нагляднее.

dchest commented 9 years ago

Да, именно. Согласен насчет статуса.

dchest commented 9 years ago

Добавил issue — #2

sergeevabc commented 9 years ago

Дмитрий, продолжаю по второстепенному вопросу о формате вывода. Сравним: var result = sha256.pbkdf2(password, salt, 150000, 32); даёт [object Uint8Array] scrypt(password, salt, 15, 8, 32, 200, function(result) {...}, null); даёт 181,253,53,216,124… Почему так? Может быть, лучше то и другое привести к одному?

dchest commented 9 years ago

scrypt-async-js совместим со старыми браузерами, поэтому не может использовать Uint8Array. Можете сделать var resultBytes = new Uint8Array(result).