github.com/aliyun/credentials-go@v1.4.7/credentials/utils/utils.go (about) 1 package utils 2 3 import ( 4 "crypto" 5 "crypto/hmac" 6 "crypto/md5" 7 "crypto/rand" 8 "crypto/rsa" 9 "crypto/sha1" 10 "crypto/x509" 11 "encoding/base64" 12 "encoding/hex" 13 "hash" 14 "io" 15 rand2 "math/rand" 16 "net/url" 17 "time" 18 ) 19 20 type uuid [16]byte 21 22 const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 23 24 var hookRead = func(fn func(p []byte) (n int, err error)) func(p []byte) (n int, err error) { 25 return fn 26 } 27 28 var hookRSA = func(fn func(rand io.Reader, priv *rsa.PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error)) func(rand io.Reader, priv *rsa.PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error) { 29 return fn 30 } 31 32 // GetUUID returns a uuid 33 // Deprecated: it was used for internal 34 func GetUUID() (uuidHex string) { 35 uuid := newUUID() 36 uuidHex = hex.EncodeToString(uuid[:]) 37 return 38 } 39 40 // RandStringBytes returns a rand string 41 func RandStringBytes(n int) string { 42 b := make([]byte, n) 43 for i := range b { 44 b[i] = letterBytes[rand2.Intn(len(letterBytes))] 45 } 46 return string(b) 47 } 48 49 // ShaHmac1 return a string which has been hashed 50 // Deprecated: it was used for internal 51 func ShaHmac1(source, secret string) string { 52 key := []byte(secret) 53 hmac := hmac.New(sha1.New, key) 54 hmac.Write([]byte(source)) 55 signedBytes := hmac.Sum(nil) 56 signedString := base64.StdEncoding.EncodeToString(signedBytes) 57 return signedString 58 } 59 60 // Sha256WithRsa return a string which has been hashed with Rsa 61 // Deprecated: it was used for internal 62 func Sha256WithRsa(source, secret string) string { 63 decodeString, err := base64.StdEncoding.DecodeString(secret) 64 if err != nil { 65 panic(err) 66 } 67 private, err := x509.ParsePKCS8PrivateKey(decodeString) 68 if err != nil { 69 panic(err) 70 } 71 72 h := crypto.Hash.New(crypto.SHA256) 73 h.Write([]byte(source)) 74 hashed := h.Sum(nil) 75 signature, err := hookRSA(rsa.SignPKCS1v15)(rand.Reader, private.(*rsa.PrivateKey), 76 crypto.SHA256, hashed) 77 if err != nil { 78 panic(err) 79 } 80 81 return base64.StdEncoding.EncodeToString(signature) 82 } 83 84 // GetMD5Base64 returns a string which has been base64 85 // Deprecated: it was used for internal 86 func GetMD5Base64(bytes []byte) (base64Value string) { 87 md5Ctx := md5.New() 88 md5Ctx.Write(bytes) 89 md5Value := md5Ctx.Sum(nil) 90 base64Value = base64.StdEncoding.EncodeToString(md5Value) 91 return 92 } 93 94 // GetTimeInFormatISO8601 returns a time string 95 // Deprecated: it was used for internal 96 func GetTimeInFormatISO8601() (timeStr string) { 97 gmt := time.FixedZone("GMT", 0) 98 99 return time.Now().In(gmt).Format("2006-01-02T15:04:05Z") 100 } 101 102 // GetURLFormedMap returns a url encoded string 103 // Deprecated: it was used for internal 104 func GetURLFormedMap(source map[string]string) (urlEncoded string) { 105 urlEncoder := url.Values{} 106 for key, value := range source { 107 urlEncoder.Add(key, value) 108 } 109 urlEncoded = urlEncoder.Encode() 110 return 111 } 112 113 func newUUID() uuid { 114 ns := uuid{} 115 safeRandom(ns[:]) 116 u := newFromHash(md5.New(), ns, RandStringBytes(16)) 117 u[6] = (u[6] & 0x0f) | (byte(2) << 4) 118 u[8] = (u[8]&(0xff>>2) | (0x02 << 6)) 119 120 return u 121 } 122 123 func newFromHash(h hash.Hash, ns uuid, name string) uuid { 124 u := uuid{} 125 h.Write(ns[:]) 126 h.Write([]byte(name)) 127 copy(u[:], h.Sum(nil)) 128 129 return u 130 } 131 132 func safeRandom(dest []byte) { 133 if _, err := hookRead(rand.Read)(dest); err != nil { 134 panic(err) 135 } 136 } 137 138 func (u uuid) String() string { 139 buf := make([]byte, 36) 140 141 hex.Encode(buf[0:8], u[0:4]) 142 buf[8] = '-' 143 hex.Encode(buf[9:13], u[4:6]) 144 buf[13] = '-' 145 hex.Encode(buf[14:18], u[6:8]) 146 buf[18] = '-' 147 hex.Encode(buf[19:23], u[8:10]) 148 buf[23] = '-' 149 hex.Encode(buf[24:], u[10:]) 150 151 return string(buf) 152 }