Browse Source

random string

update algorithm
consolidate MakeRandomString, RandomString & GenerateCrytoString into
one function
Matthew R Kasun 2 years ago
parent
commit
6d6ba3aa7d
6 changed files with 19 additions and 54 deletions
  1. 2 3
      logic/enrollmentkey.go
  2. 1 4
      logic/jwts.go
  3. 9 26
      logic/util.go
  4. 5 5
      logic/util_test.go
  5. 2 2
      mq/mq.go
  6. 0 14
      netclient/ncutils/netclientutils.go

+ 2 - 3
logic/enrollmentkey.go

@@ -9,7 +9,6 @@ import (
 
 
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/models"
-	"github.com/gravitl/netmaker/netclient/ncutils"
 )
 )
 
 
 // EnrollmentErrors - struct for holding EnrollmentKey error messages
 // EnrollmentErrors - struct for holding EnrollmentKey error messages
@@ -190,9 +189,9 @@ func getUniqueEnrollmentID() (string, error) {
 	if err != nil {
 	if err != nil {
 		return "", err
 		return "", err
 	}
 	}
-	newID := ncutils.MakeRandomString(models.EnrollmentKeyLength)
+	newID := RandomString(models.EnrollmentKeyLength)
 	for _, ok := currentKeys[newID]; ok; {
 	for _, ok := currentKeys[newID]; ok; {
-		newID = ncutils.MakeRandomString(models.EnrollmentKeyLength)
+		newID = RandomString(models.EnrollmentKeyLength)
 	}
 	}
 	return newID, nil
 	return newID, nil
 }
 }

+ 1 - 4
logic/jwts.go

@@ -19,10 +19,7 @@ var jwtSecretKey []byte
 func SetJWTSecret() {
 func SetJWTSecret() {
 	currentSecret, jwtErr := FetchJWTSecret()
 	currentSecret, jwtErr := FetchJWTSecret()
 	if jwtErr != nil {
 	if jwtErr != nil {
-		newValue, err := GenerateCryptoString(64)
-		if err != nil {
-			logger.FatalLog("something went wrong when generating JWT signature")
-		}
+		newValue := RandomString(64)
 		jwtSecretKey = []byte(newValue) // 512 bit random password
 		jwtSecretKey = []byte(newValue) // 512 bit random password
 		if err := StoreJWTSecret(string(jwtSecretKey)); err != nil {
 		if err := StoreJWTSecret(string(jwtSecretKey)); err != nil {
 			logger.FatalLog("something went wrong when configuring JWT authentication")
 			logger.FatalLog("something went wrong when configuring JWT authentication")

+ 9 - 26
logic/util.go

@@ -2,11 +2,10 @@
 package logic
 package logic
 
 
 import (
 import (
-	crand "crypto/rand"
+	"crypto/rand"
+	"encoding/base32"
 	"encoding/base64"
 	"encoding/base64"
 	"encoding/json"
 	"encoding/json"
-	"math/big"
-	"math/rand"
 	"net"
 	"net"
 	"os"
 	"os"
 	"strings"
 	"strings"
@@ -14,6 +13,7 @@ import (
 
 
 	"github.com/c-robinson/iplib"
 	"github.com/c-robinson/iplib"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/database"
+	"github.com/gravitl/netmaker/logger"
 )
 )
 
 
 // IsBase64 - checks if a string is in base64 format
 // IsBase64 - checks if a string is in base64 format
@@ -68,32 +68,15 @@ func SetNetworkNodesLastModified(networkName string) error {
 	return nil
 	return nil
 }
 }
 
 
-// GenerateCryptoString - generates random string of n length
-func GenerateCryptoString(n int) (string, error) {
-	const chars = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-"
-	ret := make([]byte, n)
-	for i := range ret {
-		num, err := crand.Int(crand.Reader, big.NewInt(int64(len(chars))))
-		if err != nil {
-			return "", err
-		}
-		ret[i] = chars[num.Int64()]
-	}
-
-	return string(ret), nil
-}
-
 // RandomString - returns a random string in a charset
 // RandomString - returns a random string in a charset
 func RandomString(length int) string {
 func RandomString(length int) string {
-	const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
-
-	var seededRand *rand.Rand = rand.New(rand.NewSource(time.Now().UnixNano()))
-
-	b := make([]byte, length)
-	for i := range b {
-		b[i] = charset[seededRand.Intn(len(charset))]
+	randombytes := make([]byte, length)
+	_, err := rand.Read(randombytes)
+	if err != nil {
+		logger.Log(0, "random string", err.Error())
+		return ""
 	}
 	}
-	return string(b)
+	return base32.StdEncoding.EncodeToString(randombytes)[:length]
 }
 }
 
 
 // StringSliceContains - sees if a string slice contains a string element
 // StringSliceContains - sees if a string slice contains a string element

+ 5 - 5
netclient/ncutils/netclientutils_test.go → logic/util_test.go

@@ -1,4 +1,4 @@
-package ncutils
+package logic
 
 
 import (
 import (
 	"strings"
 	"strings"
@@ -7,10 +7,10 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/assert"
 )
 )
 
 
-func TestMakeRandomString(t *testing.T) {
+func TestRandomString(t *testing.T) {
 	for testCase := 0; testCase < 100; testCase++ {
 	for testCase := 0; testCase < 100; testCase++ {
 		for size := 2; size < 2058; size++ {
 		for size := 2; size < 2058; size++ {
-			if length := len(MakeRandomString(size)); length != size {
+			if length := len(RandomString(size)); length != size {
 				t.Fatalf("expected random string of size %d, got %d instead", size, length)
 				t.Fatalf("expected random string of size %d, got %d instead", size, length)
 			}
 			}
 		}
 		}
@@ -18,9 +18,9 @@ func TestMakeRandomString(t *testing.T) {
 }
 }
 
 
 func TestMakeRandomStringValid(t *testing.T) {
 func TestMakeRandomStringValid(t *testing.T) {
-	lengthStr := MakeRandomString(10)
+	lengthStr := RandomString(10)
 	assert.Equal(t, len(lengthStr), 10)
 	assert.Equal(t, len(lengthStr), 10)
-	validMqID := MakeRandomString(23)
+	validMqID := RandomString(23)
 	assert.False(t, strings.Contains(validMqID, "#"))
 	assert.False(t, strings.Contains(validMqID, "#"))
 	assert.False(t, strings.Contains(validMqID, "!"))
 	assert.False(t, strings.Contains(validMqID, "!"))
 	assert.False(t, strings.Contains(validMqID, "\""))
 	assert.False(t, strings.Contains(validMqID, "\""))

+ 2 - 2
mq/mq.go

@@ -8,7 +8,7 @@ import (
 
 
 	mqtt "github.com/eclipse/paho.mqtt.golang"
 	mqtt "github.com/eclipse/paho.mqtt.golang"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logger"
-	"github.com/gravitl/netmaker/netclient/ncutils"
+	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/servercfg"
 	"github.com/gravitl/netmaker/servercfg"
 )
 )
 
 
@@ -27,7 +27,7 @@ var mqclient mqtt.Client
 func setMqOptions(user, password string, opts *mqtt.ClientOptions) {
 func setMqOptions(user, password string, opts *mqtt.ClientOptions) {
 	broker, _ := servercfg.GetMessageQueueEndpoint()
 	broker, _ := servercfg.GetMessageQueueEndpoint()
 	opts.AddBroker(broker)
 	opts.AddBroker(broker)
-	id := ncutils.MakeRandomString(23)
+	id := logic.RandomString(23)
 	opts.ClientID = id
 	opts.ClientID = id
 	opts.SetUsername(user)
 	opts.SetUsername(user)
 	opts.SetPassword(password)
 	opts.SetPassword(password)

+ 0 - 14
netclient/ncutils/netclientutils.go

@@ -2,7 +2,6 @@ package ncutils
 
 
 import (
 import (
 	"bytes"
 	"bytes"
-	"crypto/rand"
 	"encoding/gob"
 	"encoding/gob"
 )
 )
 
 
@@ -32,16 +31,3 @@ func ConvertBytesToKey(data []byte) (*[32]byte, error) {
 	}
 	}
 	return result, err
 	return result, err
 }
 }
-
-// MakeRandomString - generates a random string of len n
-func MakeRandomString(n int) string {
-	const validChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-	result := make([]byte, n)
-	if _, err := rand.Reader.Read(result); err != nil {
-		return ""
-	}
-	for i, b := range result {
-		result[i] = validChars[b%byte(len(validChars))]
-	}
-	return string(result)
-}