Ускорение скрипта на андроиде

Я использую scrypt при создании приложения для Android, и вычисление хэша занимает очень много времени. Вот как я это называю:

String hash = Base64.encodeToString(SCrypt.scrypt("password".getBytes(), "salt".toString().getBytes(), 16384, 16, 2, 128), Base64.DEFAULT);

И вот как я объявил зависимость в Gradle:

compile group: 'com.lambdaworks', name: 'scrypt', version: '1.4.0'

Вычисление хэша на моем Nexus 6P занимает почти минуту, и это, конечно, очень медленно. Кто-нибудь знает, как это можно сделать намного быстрее? Я новичок в этом и, следовательно, не знаю, почему это так медленно и как его ускорить.


person pratnala    schedule 08.07.2016    source источник
comment
Как вы можете сказать, когда все втиснуто в одну строку, что делает отладку и понимание намного сложнее. Предоставьте минимальный воспроизводимый пример, все остальное не относится к script(). Вы должны стремиться к около 100 мс.   -  person zaph    schedule 08.07.2016


Ответы (1)


Я думаю, что SCrypt.scrypt()parameters должны быть оптимизированы для ваших вариантов использования.

Некоторые числа в этом ответе и этот слайд стр.17

(N = 2^14, r = 8, p = 1) для ‹ 100 мс (интерактивное использование)

(N = 2^20, r = 8, p = 1) для ‹ 5 с (конфиденциальное хранение)

и значения N,r,p:

N: общий коэффициент работы, количество итераций.

r: размер блока, используемый для базового хэша; точно настраивает относительную стоимость памяти.

p: коэффициент распараллеливания; тонкая настройка относительной стоимости процессора

Поэтому, если вы хотите меньше времени, N следует уменьшить. r и p связаны с аппаратным обеспечением, для динамической настройки требуется дополнительная среда выполнения.

person sakiM    schedule 08.07.2016
comment
Время выполнения операции скрипта определяется значением N и аппаратным обеспечением, на котором она выполняется. Для более медленного оборудования уменьшите значение N до приемлемого времени, ~100 мс — разумный компромисс между временем и безопасностью. - person zaph; 08.07.2016
comment
Итак, мой телефон просто медленный, когда ему требуется минута для вычислений? Я не против нескольких секунд. - person pratnala; 08.07.2016
comment
Я не думаю, что это заставит ваш телефон чувствовать себя медленным при вычислении этого, ЕСЛИ вы не поместите его в поток пользовательского интерфейса. Вы можете обратиться к асинхронной задаче в Android, чтобы улучшить взаимодействие с пользователем. - person sakiM; 09.07.2016
comment
Мне жаль, что я не могу понять. После того, как я нажимаю кнопку для вычисления, вычисление занимает около 60-70 секунд, что, очевидно, слишком много времени. Как его ускорить? - person pratnala; 09.07.2016
comment
Вы уменьшили число 16384 в SCrypt.scrypt(...) ? попробуй 8000, 4000, 2000 и посмотри на скорость и результат - person sakiM; 09.07.2016
comment
Однако даже использование асинхронной задачи не помогает ускорить ее. Я видел другие приложения, которые используют эти параметры, но работают быстрее. В чем проблема? - person pratnala; 21.08.2016
comment
У меня тоже есть эта проблема. N равно 2 ^ 14, но на некоторых телефонах это занимает много времени (~ 60 с) (на самом деле на всех телефонах, кроме моего :)) ) - person Alireza Omidi; 02.07.2018
comment
@AlirezaOmidi каковы все параметры и длина текста скрипта? как р? Пример RFC7914 не является таким большим значением N. (Максимальное число N равно 1048576) - person sakiM; 09.07.2018
comment
@sakiM Я решил проблему, просто создав файл .apk и установив его. Использование Run или Debug в Android Studio было проблемой. Я думаю, что профилирование работающего приложения, которое делала Android Studio, требует огромных накладных расходов. параметры в норме (N=16384). - person Alireza Omidi; 10.07.2018