Реалізація безпечного віддаленого пароля (SRP)

Щоб зрозуміти SRP, подивіться, як ви генеруєте ключ AES з DH; Тепер просто спостерігайте, що ви можете виконати “протилежну” операцію та створити числовий параметр із хешу. Потім:

Замініть A і B на C і S (клієнт і сервер)

C і S

Домовтеся про N=[Просте число від NIST], g=2, k=3, I (email), P (пароль)

S

  1. Згенеруйте сіль як випадкове ціле число
  2. Згенеруйте рядок xH=SHA256(сіль пароль)
  3. Перетворіть xH на ціле число x (поставте 0x у hexdigest)
  4. Згенеруйте v=g**x % N
  5. Зберегти увсе окрім x, xH

C->S

Надіслати I, A=g**a % N (а-ля Діффі Хеллман)

S->C

Надішліть сіль, B=kv + g**b % N

S, C

Обчислити рядок uH = SHA256(A B), u = ціле від uH

C

  1. Згенерувати рядок xH=SHA256(сіль пароль)
  2. Перетворіть xH на ціле число x (поставте 0x у hexdigest)
  3. Згенеруйте S = (B - k * gx)(a + u * x) % N
  4. Створити K = SHA256(S)

С

  1. Згенеруйте S = (A * v**u) ** b % N
  2. Створити K = SHA256(S)

C->S

Надіслати HMAC-SHA256(K, сіль)

S->C

Надішліть “OK”, якщо HMAC-SHA256(K, сіль) перевірено

Ви захочете зробити це на якомусь REPL; може знадобитися кілька спроб.

Немає значення, як ви переходите від цілого до рядка або від рядка до цілого (де все відбувається в SHA256 або з нього), якщо ви робите це однаковим чином. Я тестував, використовуючи десяткове представлення цілих чисел ASCII як вхідні дані для SHA256 і перетворюючи шістнадцятковий дайджест на ціле число під час обробки його виводу.

По суті, це Діффі Хеллман із налаштуванням змішування пароля з відкритими ключами. Сервер також робить додатковий крок, щоб уникнути зберігання еквівалента пароля, який легко зламати.