Как вычислить вложенный / повторный хэш MD5 в Golang? - PullRequest
0 голосов
/ 10 января 2019

Я нахожусь в процессе создания программы для подбора паролей с помощью golang. Формат хэшей пароля - это хэш md5, примененный 1000x к исходному паролю, а затем используемый. (Код, который я показываю, только применяет это 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))

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

1 Ответ

0 голосов
/ 10 января 2019

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

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

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

...