secure key generation
Former-commit-id: 65ac66cff7b8729207045754674d5768c709c850 [formerly ffe758e02f53a68f4e5e141d9697667293eea3db] [formerly b4c075bca9f7b1ebac7bf798e3f694059df6f34c [formerly eb0126764317528cca76175a4bb20a881a50ecc2]] Former-commit-id: ccf78e5c6ca1d7be8125031dd905b57adab6ddb0 [formerly 7776566a9d8f1861b84ffdfe70bd49e506371845] Former-commit-id: 51ddf89483b176a0b35df85dc7d4b1b60edcff64
This commit is contained in:
		
							parent
							
								
									3d28f92e52
								
							
						
					
					
						commit
						c62363b26a
					
				
							
								
								
									
										24
									
								
								auth.go
								
								
								
								
							
							
						
						
									
										24
									
								
								auth.go
								
								
								
								
							| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
package filemanager
 | 
					package filemanager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"crypto/rand"
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"math/rand"
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
| 
						 | 
					@ -147,15 +147,17 @@ func checkPasswordHash(password, hash string) bool {
 | 
				
			||||||
	return err == nil
 | 
						return err == nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
 | 
					// generateRandomBytes returns securely generated random bytes.
 | 
				
			||||||
 | 
					// It will return an error if the system's secure random
 | 
				
			||||||
// randomString creates a string with a defined length using the above charset.
 | 
					// number generator fails to function correctly, in which
 | 
				
			||||||
func randomString(length int) string {
 | 
					// case the caller should not continue.
 | 
				
			||||||
	seededRand := rand.New(rand.NewSource(time.Now().UnixNano()))
 | 
					func generateRandomBytes(n int) ([]byte, error) {
 | 
				
			||||||
 | 
						b := make([]byte, n)
 | 
				
			||||||
	b := make([]byte, length)
 | 
						_, err := rand.Read(b)
 | 
				
			||||||
	for i := range b {
 | 
						// Note that err == nil only if we read len(b) bytes.
 | 
				
			||||||
		b[i] = charset[seededRand.Intn(len(charset))]
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return string(b)
 | 
					
 | 
				
			||||||
 | 
						return b, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -163,7 +163,13 @@ func New(database string, base User) (*FileManager, error) {
 | 
				
			||||||
	// If it doesn't exist, create a new one of 256 bits.
 | 
						// If it doesn't exist, create a new one of 256 bits.
 | 
				
			||||||
	err = db.Get("config", "key", &m.key)
 | 
						err = db.Get("config", "key", &m.key)
 | 
				
			||||||
	if err != nil && err == storm.ErrNotFound {
 | 
						if err != nil && err == storm.ErrNotFound {
 | 
				
			||||||
		m.key = []byte(randomString(64))
 | 
							var bytes []byte
 | 
				
			||||||
 | 
							bytes, err = generateRandomBytes(64)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m.key = bytes
 | 
				
			||||||
		err = db.Set("config", "key", m.key)
 | 
							err = db.Set("config", "key", m.key)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue