|  | @@ -15,6 +15,7 @@ import (
 | 
	
		
			
				|  |  |  	"hash"
 | 
	
		
			
				|  |  |  	"html/template"
 | 
	
		
			
				|  |  |  	"math"
 | 
	
		
			
				|  |  | +	"math/big"
 | 
	
		
			
				|  |  |  	"net/http"
 | 
	
		
			
				|  |  |  	"strings"
 | 
	
		
			
				|  |  |  	"time"
 | 
	
	
		
			
				|  | @@ -82,18 +83,31 @@ func BasicAuthEncode(username, password string) string {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // GetRandomString generate random string by specify chars.
 | 
	
		
			
				|  |  | -func GetRandomString(n int, alphabets ...byte) string {
 | 
	
		
			
				|  |  | +func GetRandomString(n int) (string, error) {
 | 
	
		
			
				|  |  |  	const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
 | 
	
		
			
				|  |  | -	var bytes = make([]byte, n)
 | 
	
		
			
				|  |  | -	rand.Read(bytes)
 | 
	
		
			
				|  |  | -	for i, b := range bytes {
 | 
	
		
			
				|  |  | -		if len(alphabets) == 0 {
 | 
	
		
			
				|  |  | -			bytes[i] = alphanum[b%byte(len(alphanum))]
 | 
	
		
			
				|  |  | -		} else {
 | 
	
		
			
				|  |  | -			bytes[i] = alphabets[b%byte(len(alphabets))]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	buffer := make([]byte, n)
 | 
	
		
			
				|  |  | +	max := big.NewInt(int64(len(alphanum)))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	for i := 0; i < n; i++ {
 | 
	
		
			
				|  |  | +		index, err := randomInt(max)
 | 
	
		
			
				|  |  | +		if err != nil {
 | 
	
		
			
				|  |  | +			return "", err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		buffer[i] = alphanum[index]
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return string(buffer), nil
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func randomInt(max *big.Int) (int, error) {
 | 
	
		
			
				|  |  | +	rand, err := rand.Int(rand.Reader, max)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return 0, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	return string(bytes)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return int(rand.Int64()), nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // http://code.google.com/p/go/source/browse/pbkdf2/pbkdf2.go?repo=crypto
 |