Skip to content

Commit

Permalink
Modifying to be more simplistic to use
Browse files Browse the repository at this point in the history
  • Loading branch information
COMTOP1 committed Feb 15, 2025
1 parent 90eb357 commit 510f9c2
Showing 1 changed file with 63 additions and 16 deletions.
79 changes: 63 additions & 16 deletions utils/hash.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,35 @@ package utils
import (
"crypto/rand"
"encoding/hex"
"errors"
"fmt"
"math/big"

whirl "github.com/balacode/zr-whirl"
)

type Type int
type (
Type int
Length int
Characters string
)

const (
GeneratePassword Type = iota
GenerateSalt
GenerateUsername
)

const (
UsernameCharacters Characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
SaltCharacters Characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/."
PasswordCharacters Characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@*()&"
)

const (
saltCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/."
passwordCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@*()&"
PasswordLength Length = 12
SaltLength Length = 22
UsernameLength Length = 20
)

// HashPass hashes a password using a Whirlpool hash.
Expand All @@ -37,45 +50,79 @@ func HashPass(password string) string {
return next
}

func GenerateRandomLength(length int, randomType Type) (string, error) {
if length < 6 || length > 40 {
return "", errors.New("length must be between 6 and 40")
}
switch randomType {
case GeneratePassword:
b, err := rangeLoop(PasswordCharacters, Length(length))
if err != nil {
return "", fmt.Errorf("error generating random password: %w", err)
}

return b, nil
case GenerateSalt:
b, err := rangeLoop(SaltCharacters, Length(length))
if err != nil {
return "", fmt.Errorf("error generating random salt: %w", err)
}

return "$2a$06$" + b, nil
case GenerateUsername:
b, err := rangeLoop(UsernameCharacters, Length(length))
if err != nil {
return "", fmt.Errorf("error generating random username: %w", err)
}

return b, nil
default:
return "", fmt.Errorf("invalid type: %d", randomType)
}
}

// GenerateRandom generates a random string for either password or salt
func GenerateRandom(randomType Type) (string, error) {
switch randomType {
case GeneratePassword:
lenPass := big.NewInt(int64(len(passwordCharacters)))
passwordLength := 12

b, err := rangeLoop(lenPass, passwordLength)
b, err := rangeLoop(PasswordCharacters, PasswordLength)
if err != nil {
return "", fmt.Errorf("error generating random: %w", err)
return "", fmt.Errorf("error generating random password: %w", err)
}

return b, nil
case GenerateSalt:
lenSalt := big.NewInt(int64(len(saltCharacters)))
saltLength := 22

b, err := rangeLoop(lenSalt, saltLength)
b, err := rangeLoop(SaltCharacters, SaltLength)
if err != nil {
return "", fmt.Errorf("error generating random: %w", err)
return "", fmt.Errorf("error generating random salt: %w", err)
}

return "$2a$06$" + b, nil
case GenerateUsername:
b, err := rangeLoop(UsernameCharacters, UsernameLength)
if err != nil {
return "", fmt.Errorf("error generating random username: %w", err)
}

return b, nil
default:
return "", fmt.Errorf("invalid type: %d", randomType)
}
}

// rangeLoop creates the random string that will be used
func rangeLoop(length *big.Int, size int) (string, error) {
bytes := make([]byte, size)
func rangeLoop(characters Characters, randomLength Length) (string, error) {
bytes := make([]byte, randomLength)

length := big.NewInt(int64(len(characters)))

for i := range bytes {
randInt, err := rand.Int(rand.Reader, length)
if err != nil {
return "", err
}

bytes[i] = passwordCharacters[randInt.Int64()]
bytes[i] = characters[randInt.Int64()]
}

return string(bytes), nil
Expand Down

0 comments on commit 510f9c2

Please sign in to comment.