Сложность примерно равна time_cost * memory_cost
(и, возможно, / parallelism
). Итак, если вы 0.25x
стоимость памяти, вы должны 4x
затраты времени. См. Также этот ответ .
// The time parameter specifies the number of passes over the memory and the
// memory parameter specifies the size of the memory in KiB.
Ознакомьтесь с самим API Argon2. Я собираюсь сделать небольшую ссылку и использовать документацию argon2-cffi . Похоже, что интерфейс go использует C -FFI (интерфейс внешней функции) под капотом , поэтому прототип должен быть таким же.
Parameters
time_cost (int) – Defines the amount of computation realized and therefore the execution time, given in number of iterations.
memory_cost (int) – Defines the memory usage, given in kibibytes.
parallelism (int) – Defines the number of parallel threads (changes the resulting hash value).
hash_len (int) – Length of the hash in bytes.
salt_len (int) – Length of random salt to be generated for each password.
encoding (str) – The Argon2 C library expects bytes. So if hash() or verify() are passed an unicode string, it will be encoded using this encoding.
type (Type) – Argon2 type to use. Only change for interoperability with legacy systems.
Действительно, если мы смотрим на Go документы:
// The draft RFC recommends[2] time=1, and memory=64*1024 is a sensible number.
// If using that amount of memory (64 MB) is not possible in some contexts then
// the time parameter can be increased to compensate.
//
// The time parameter specifies the number of passes over the memory and the
// memory parameter specifies the size of the memory in KiB. For example
// memory=64*1024 sets the memory cost to ~64 MB. The number of threads can be
// adjusted to the numbers of available CPUs. The cost parameters should be
// increased as memory latency and CPU parallelism increases. Remember to get a
// good random salt.
Я не на 100% понимаю влияние количества потоков, но я считаю, что он распараллеливает хеширование, и, как и любое многопоточное задание, это уменьшает общее время, затраченное примерно на 1/N
для N ядер. По-видимому, вы должны по существу установить для параллелизма значение cpu count .