SHA-512를 사용하여 Golang에서 암호를 해시하고 소금에 절이는 방법과 하지 말아야 하는 이유 😤

해싱 및 솔팅 비밀번호는 존경할만한 서비스의 비밀번호를 보호하기 위한 업계 표준입니다. 한 가지 옵션은 빠르게 계산하는 SHA-512를 사용하는 것입니다. 단점은 공격자가 계산 능력으로 이것을 이용하고 암호를 해독할 수 있다는 것입니다 😬.

Bcrypt를 사용하는 것이 더 나은 옵션입니다.



SHA와 같은 알고리즘은 빠르고 효율적이어서 공격자가 신속하게 암호 일치를 무차별 대입할 수 있습니다. 보안을 위한 좋은 선택은 아니지만 다행스럽게도 암호를 천천히 해싱하도록 설계된 Bcrypt라는 또 다른 해싱 알고리즘이 있습니다.

이것은 암호가 무차별 대입될 수 없고 계산 능력의 증가가 거의 도움이 되지 않기 때문에 공격자를 좌절시킵니다. 에 대한 내 기사에서 자세히 알아보십시오.

해싱 단계


  • 암호 문자열을 바이트 슬라이스로 변환
  • 16바이트의 임의 솔트 생성(Linus, BSD Unixes 및 Solaris의 SHA2-crypt 메서드는 16바이트 사용)
  • 암호 슬라이스에 솔트 추가
  • 결과 연결을 해시합니다
  • .

    구현




    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에 가입하는 것을 고려해 보십시오.

    좋은 웹페이지 즐겨찾기