[이동] HMAC-SHA512 구현 해보기

14520 단어 go

소개



이번에는 HMAC-SHA512를 구현해보겠다.
저번에 썼던 SHA-512 함수를 사용하겠습니다.


  • 비밀 키



    HMAC는 해시 값을 얻기 위해 키와 메시지가 필요합니다.

    키에는 몇 가지 기능이 있습니다.
  • 발신자와 수신자만 공유하는 것
  • 길이 제한 없음
  • 길이가 해시 함수의 바이트 길이보다 짧은 경우 해당 길이가 되도록 먼저 0으로 채워집니다
  • .
  • 길이가 해시 함수의 바이트 길이보다 긴 경우 먼저 해시됩니다
  • .

    "PasswordHasher"도 암호(메시지)를 키로 사용하는 것 같습니다.
  • aspnetcore/PasswordHasher.cs - dotnet/aspnetcore - GitHub
  • aspnetcore/ManagedPbkdf2Provider.cs - dotnet/aspnetcore - GitHub

  • SHA-512 업데이트



    지난 번에는 결과를 문자열 값으로 반환했습니다.

    하지만 키를 추가하기 위해 값을 바이트 배열로 가져오고 싶기 때문에 SHA-512 함수를 변경합니다.

    sha512Hasher.go




    ...
    func Hash(inputValues []byte) []byte {
        formattedMessage := formatInput(inputValues)
        computed := compute(formattedMessage)
        return computed
    }
    ...
    func compute(messages []byte) []byte {
    ...
        // get H[N]
        var results []byte
        for _, h := range H {
            b := make([]byte, 8)
            binary.BigEndian.PutUint64(b, h)
            results = append(results, b...)
        }
        return results
    }
    


  • How can I convert an int64 into a byte array in go? - StackOverflow
  • Concatenate 2 slices in golang - StackOverflow



  • main.go




    package main
    
    import (
        "crypto/hmac"
        "crypto/sha512"
        "fmt"
        "log"
    )
    
    func main() {
        inputData := []byte("hello")
        hmacSHA512Results := HashHMACSHA512(inputData, inputData)
        var hresult string
        for _, r := range hmacSHA512Results {
            hresult += fmt.Sprintf("%02X", r)
        }
        log.Println(hresult)
    
        h := hmac.New(sha512.New, inputData)
        h.Write(inputData)
        results := h.Sum(nil)
    
        var result string
        for _, r := range results {
            result += fmt.Sprintf("%02X", r)
        }
        log.Println(result)
    }
    


    hmacSHA512Hasher.go




    package main
    
    const byteLength int = 128
    
    /* compute H(K XOR opad, H(K XOR ipad, text)) */
    func HashHMACSHA512(inputData, keyData []byte) []byte {
        formattedKey := formatKey(keyData)
    
        ipad := xorIPAD(formattedKey)
        // append the stream of input data to the result of (K XOR ipad)
        // and hash the value
        innerData := Hash(append(ipad, inputData...))
    
        opad := xorOPAD(formattedKey)
        // append the H result to the result of (K XOR opad)
        // and hash the value
        return Hash(append(opad, innerData...))
    }
    func formatKey(keyData []byte) []byte {
        // If its length is longer than the byte-length,
        // it will be hashed first
        if len(keyData) >= byteLength {
            return Hash(keyData)
        }
        // If its length is shorter than the byte-length,
        // it is first filled with zeros to make it that length
        results := make([]byte, byteLength)
        copy(results, keyData)
        for i := len(keyData); i < byteLength; i++ {
            results[i] = 0x00
        }
        return results
    }
    
    /* K XOR ipad(ipad = the byte 0x36 repeated B times) */
    func xorIPAD(k []byte) []byte {
        results := make([]byte, len(k))
        for i, key := range k {
            results[i] = key ^ 0x36
        }
        return results
    }
    
    /* K XOR opad(opad = the byte 0x5C repeated B times) */
    func xorOPAD(k []byte) []byte {
        results := make([]byte, len(k))
        for i, key := range k {
            results[i] = key ^ 0x5C
        }
        return results
    }
    


    결과




    8F9909C45E601A31A2E6949FE6E4C739ADE74F3A0A5F9489D4E5F8BC5B71C08C998C78E14AB4C524E884A308E1E4B9902E7E76D9E1328E5A603B7DFA42604D74
    8F9909C45E601A31A2E6949FE6E4C739ADE74F3A0A5F9489D4E5F8BC5B71C08C998C78E14AB4C524E884A308E1E4B9902E7E76D9E1328E5A603B7DFA42604D74
    


    자원


  • RFC2104 - HMAC: Keyed-Hashing for Message Authentication
  • FIPS198-1 - The Keyed-Hash Message Authentication Code (HMAC)
  • RFC6234 - US Secure Hash Algorithms(SHA and SHA-based HMAC and HKDF)
  • hmac package - crypto/hmac - Go packages
  • 좋은 웹페이지 즐겨찾기