SHA-512를 사용하여 Golang에서 암호를 해시하고 소금에 절이는 방법과 하지 말아야 하는 이유 😤
8108 단어 programmingtutorialgowebdev
Bcrypt를 사용하는 것이 더 나은 옵션입니다.
SHA와 같은 알고리즘은 빠르고 효율적이어서 공격자가 신속하게 암호 일치를 무차별 대입할 수 있습니다. 보안을 위한 좋은 선택은 아니지만 다행스럽게도 암호를 천천히 해싱하도록 설계된 Bcrypt라는 또 다른 해싱 알고리즘이 있습니다.
이것은 암호가 무차별 대입될 수 없고 계산 능력의 증가가 거의 도움이 되지 않기 때문에 공격자를 좌절시킵니다. 에 대한 내 기사에서 자세히 알아보십시오.
해싱 단계
구현
package main
import (
"crypto/rand"
"crypto/sha512"
"encoding/hex"
"fmt"
)
// Define salt size
const saltSize = 16
// Generate 16 bytes randomly and securely using the
// Cryptographically secure pseudorandom number generator (CSPRNG)
// in the crypto.rand package
func generateRandomSalt(saltSize int) []byte {
var salt = make([]byte, saltSize)
_, err := rand.Read(salt[:])
if err != nil {
panic(err)
}
return salt
}
// Combine password and salt then hash them using the SHA-512
// hashing algorithm and then return the hashed password
// as a hex string
func hashPassword(password string, salt []byte) string {
// Convert password string to byte slice
var passwordBytes = []byte(password)
// Create sha-512 hasher
var sha512Hasher = sha512.New()
// Append salt to password
passwordBytes = append(passwordBytes, salt...)
// Write password bytes to the hasher
sha512Hasher.Write(passwordBytes)
// Get the SHA-512 hashed password
var hashedPasswordBytes = sha512Hasher.Sum(nil)
// Convert the hashed password to a hex string
var hashedPasswordHex = hex.EncodeToString(hashedPasswordBytes)
return hashedPasswordHex
}
// Check if two passwords match
func doPasswordsMatch(hashedPassword, currPassword string,
salt []byte) bool {
var currPasswordHash = hashPassword(currPassword, salt)
return hashedPassword == currPasswordHash
}
func main() {
// Generate random 16 byte salt
var salt = generateRandomSalt(saltSize)
// Hash password using the salt
var hashedPassword = hashPassword("hello", salt)
fmt.Println("Password Hash:", hashedPassword)
fmt.Println("Salt:", salt)
// Check if passed password matches the original password by hashing it
// with the original password's salt and check if the hashes match
fmt.Println("Password Match:",
doPasswordsMatch(hashedPassword, "hello", salt))
}
Password Hash: c7b714330211d3eddd0b047cde89b6ce618f321532eeb6ebbd0974c0d92097a66a2264a9b42012eb3387fe91f217e2109f2eefa26ee24a9c33e5417365bf07ec
Salt: [192 42 57 120 177 235 67 200 75 110 215 162 5 44 205 20]
Password Match: true
저자 소개
Twitter에서 저를 팔로우하고 mynewsletter에 가입하는 것을 고려해 보십시오.
Reference
이 문제에 관하여(SHA-512를 사용하여 Golang에서 암호를 해시하고 소금에 절이는 방법과 하지 말아야 하는 이유 😤), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gregorygaines/how-to-hash-and-salt-passwords-in-golang-using-sha-512-and-why-you-shouldnt-2ifh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)