[이동] HMAC-SHA512 구현 해보기
14520 단어 go
소개
이번에는 HMAC-SHA512를 구현해보겠다.
저번에 썼던 SHA-512 함수를 사용하겠습니다.
비밀 키
HMAC는 해시 값을 얻기 위해 키와 메시지가 필요합니다.
키에는 몇 가지 기능이 있습니다.
"PasswordHasher"도 암호(메시지)를 키로 사용하는 것 같습니다.
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
}
예
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
자원
Reference
이 문제에 관하여([이동] HMAC-SHA512 구현 해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/masanori_msl/go-try-hmac-sha512-implementation-2pij텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)