Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

password_salted.go 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright (c) 2016 Daniel Oaks <daniel@danieloaks.net>
  2. // released under the MIT license
  3. package irc
  4. import (
  5. "crypto/rand"
  6. "golang.org/x/crypto/bcrypt"
  7. )
  8. const newSaltLen = 30
  9. const defaultPasswordCost = 14
  10. // NewSalt returns a salt for crypto uses.
  11. func NewSalt() ([]byte, error) {
  12. salt := make([]byte, newSaltLen)
  13. _, err := rand.Read(salt)
  14. if err != nil {
  15. var emptySalt []byte
  16. return emptySalt, err
  17. }
  18. return salt, nil
  19. }
  20. // PasswordManager supports the hashing and comparing of passwords with the given salt.
  21. type PasswordManager struct {
  22. salt []byte
  23. }
  24. // NewPasswordManager returns a new PasswordManager with the given salt.
  25. func NewPasswordManager(salt []byte) PasswordManager {
  26. var pwm PasswordManager
  27. pwm.salt = salt
  28. return pwm
  29. }
  30. // assemblePassword returns an assembled slice of bytes for the given password details.
  31. func (pwm *PasswordManager) assemblePassword(specialSalt []byte, password string) []byte {
  32. var assembledPasswordBytes []byte
  33. assembledPasswordBytes = append(assembledPasswordBytes, pwm.salt...)
  34. assembledPasswordBytes = append(assembledPasswordBytes, '-')
  35. assembledPasswordBytes = append(assembledPasswordBytes, specialSalt...)
  36. assembledPasswordBytes = append(assembledPasswordBytes, '-')
  37. assembledPasswordBytes = append(assembledPasswordBytes, []byte(password)...)
  38. return assembledPasswordBytes
  39. }
  40. // GenerateFromPassword encrypts the given password.
  41. func (pwm *PasswordManager) GenerateFromPassword(specialSalt []byte, password string) ([]byte, error) {
  42. assembledPasswordBytes := pwm.assemblePassword(specialSalt, password)
  43. return bcrypt.GenerateFromPassword(assembledPasswordBytes, defaultPasswordCost)
  44. }
  45. // CompareHashAndPassword compares a hashed password with its possible plaintext equivalent.
  46. // Returns nil on success, or an error on failure.
  47. func (pwm *PasswordManager) CompareHashAndPassword(hashedPassword []byte, specialSalt []byte, password string) error {
  48. assembledPasswordBytes := pwm.assemblePassword(specialSalt, password)
  49. return bcrypt.CompareHashAndPassword(hashedPassword, assembledPasswordBytes)
  50. }