Go за Прикладом: SHA1 Хеші

Work in Progress / Сайт в процесі розробки

хешування SHA1 використовують для визначення коротких ідентифікаторів для двійкових або текстових даних. Наприклад, система контролю версій git використовує SHA1 для ідентифікації змін файлів та директорій. В Go визначити SHA1 хеш можна наступним чином.

package main

Go реалізує кілька різноманітних алгоритмів хешування, вони доступні нам як пакети crypto/*.

import "crypto/sha1"
import "fmt"
func main() {
    s1 := "це рядок sha1"

Шаблон для генерації хешу наступний - sha1.New(), sha1.Write(bytes), і наостанок sha1.Sum([]byte{}). Почнеємо - з генерації нового хешу.

    h := sha1.New()

Write очікує байти і у випадку s1 це рядок, скористаємось []byte(s) для конвертації його у байти.

    h.Write([]byte(s1))

Результатом цієї операції - стане SHA1 хеш у вигляді зрізу байтів, який ми можемо представити як рядок пізніше. Аргумент ( що передається Sum) може бути використано, з ціллю додати його напочаток отриманого зрізу нашого хешу, але насправді така операція зазвичай не потрібна (це не “солінння“ як можна було б подумати спочатку).

    bs1 := h.Sum(nil)

SHA1 значення часто доступні у шістнадцятирічному вигляді (наприклад у git commit’ах). Скористайтесь дієсловом форматування %x - для конвертації хеш результату в шістнадцятирічний рядок.

    fmt.Println(s1)
    fmt.Printf("%x\n", bs1)

А ще, можна скористатись функцієї-обгорткою sha1.Sum, яка відразу надасть вам потрібний хеш у вигляді байтового зрізу.

    s2 := "використай sha1.Sum([]byte)"
    bs2 := sha1.Sum([]byte(s2))
    fmt.Println(s2)
    fmt.Printf("%x\n", bs2)
}

Запуск цієї программи порахуує хеш та виведе його у форматі зрозумілому для людини.

$ go run sha1-hashes.go
це рядок sha1
afa57c30c2333a0a4bccd5d7292efc211f07e510
використай sha1.Sum([]byte)
5f0d608c5a8be56c733b6113d6161198f687436c

Ви можете обчислювати і інші хеші використовуючи схожий до вищенаведеного сценарій. Наприклад, порахувати MD5 хеші - можливо після імпорту crypto/md5 і використання md5.New() (або md5.Sum([]byte) - що значно зручніше).

Зауважте - якщо вам потрібні криптографічно-безпечні хеші - порівняйте про різноматнітні алгоритми шифрування, їх переваги і недоліки!

Наступний приклад: Кодування Base64.