Как вычислить вложенный/итерированный хэш MD5 в Golang?

Я нахожусь в процессе создания программы для перебора паролей с использованием golang. Формат хэшей паролей представляет собой хэш md5, примененный в 1000 раз к начальному паролю, а затем к используемому. (Код, который я показываю, применяет только это 5x)

md5(md5(md5(md5(....(md5(пароль))))))

func hash(pw string) string {
    hasher := md5.New()

    data := []byte(pw)
    fmt.Printf("Initial data: %s\n", pw)

    for i := 0; i < 5; i++ {
        hasher.Reset()
        hasher.Write(data)
        sum := hasher.Sum(nil)
        data = sum[:]
        fmt.Printf("Iteration %x has the hash: %x\n", i+1, data)
    }
    return hex.EncodeToString(data)
}

Результат от этого отличается от того, что дает использование утилиты командной строки md5sum. Моя другая попытка состояла в том, чтобы использовать, потому что это было без гражданства, но я все еще начинаю отклоняться во втором раунде хеширования.

sum := md5.Sum([]byte(data))

Каков хороший/успешный способ вычисления этого повторяющегося хэша?


person Daniel Stinson-Diess    schedule 10.01.2019    source источник


Ответы (1)


Может быть, я неправильно понимаю ваш вопрос, но это то, что вы ищете?

package main

import (
    "crypto/md5"
    "fmt"
    "io"
)

func main() {
    fmt.Printf("\nresult: %s", md5plus("123", 2))
}

func md5plus(text string, cost int) string {
    for i := 0; i < cost; i++ {
        fmt.Printf("Loop %d: %s", i+1, text)
        hash := md5.New()
        io.WriteString(hash, text)
        text = fmt.Sprintf("%x", hash.Sum(nil))
        fmt.Printf(" => %s\n", text)
    }

    return text
}

https://play.golang.org/p/ri-5m3RZ_8v

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

person syntaqx    schedule 10.01.2019
comment
Ага, это точно! Я прочитал это: мы можем использовать возвращенный хэш (который имеет тип hash.Hash) для вычисления хэшей MD5, но что здорово, так это то, что мы можем повторно использовать его для вычисления хэшей нескольких байтовых срезов. из здесь, что заставило меня подумать, что я мог бы использовать тот же экземпляр хэшера md5. - person Daniel Stinson-Diess; 10.01.2019
comment
Честно говоря, вы, вероятно, можете добиться того, о чем просите, используя метод Reset, но он кажется излишне сложным для такого недолговечного значения. md5.New не делает ничего особенно дорогого для своей инициализации, поэтому я использую этот подход. - В любом случае, рад, что это работает для вас! ГЛ. - person syntaqx; 10.01.2019