package crypter import ( "crypto/md5" "encoding/base64" "fmt" "io" "strconv" "strings" "time" ) // SSO gxytoken authcode // btype 加密or解密 bool true:加密 false:解密 默认false // skey 秘钥 // text 加/解密内容 func AuthCode(text, skey string, btype bool) string { isEncode := btype key := skey expiry := 0 cKeyLen := 4 timestamp := time.Now().Unix() // md5加密key mKey := Md5Sum(key) // 参与加密的 keyA := Md5Sum(mKey[0:16]) // 用于验证数据有效性的 keyB := Md5Sum(mKey[16:]) // 动态部分 var keyC string if cKeyLen > 0 { if isEncode { // 加密的时候,动态获取一个秘钥 keyC = Md5Sum(fmt.Sprint(timestamp))[32-cKeyLen:] } else { // 解密的时候从头部获取动态秘钥部分 keyC = text[0:cKeyLen] } } // 加入了动态的秘钥 cryptKey := keyA + Md5Sum(keyA+keyC) // 秘钥长度 keyLen := len(cryptKey) if isEncode { // 加密 前10位是过期验证字符串 10-26位字符串验证 var d int64 if expiry > 0 { d = timestamp + int64(expiry) } text = fmt.Sprintf("%010d%s%s", d, Md5Sum(text + keyB)[0:16], text) } else { // 解密 //res, _ := base64.StdEncoding.DecodeString(text[cKeyLen:]) res := Base64Decode(text[cKeyLen:]) text = string(res) } // 字符串长度 textLen := len(text) if textLen <= 0 { return "" } // 密匙簿(0-256) box := make([]int, 0) for i := 0; i < 256; i++ { box = append(box, i) } // 对称算法 var rndKey []int cryptKeyB := []byte(cryptKey) for i := 0; i < 256; i++ { pos := i % keyLen rndKey = append(rndKey, int(cryptKeyB[pos])) } j := 0 for i := 0; i < 256; i++ { j = (j + box[i] + rndKey[i]) % 256 box[i], box[j] = box[j], box[i] } textB := []byte(text) a := 0 j = 0 var result []byte for i := 0; i < textLen; i++ { a = (a + 1) % 256 j = (j + box[a]) % 256 box[a], box[j] = box[j], box[a] result = append(result, byte(int(textB[i])^(box[(box[a]+box[j])%256]))) } if isEncode { return keyC + strings.Replace(base64.StdEncoding.EncodeToString(result), "=", "", -1) } // 获取前10位,判断过期时间 d, err := strconv.ParseInt(string(result[0:10]), 10, 64) if err != nil { d = 0 } fmt.Println(string(result[10:26]), Md5Sum(string(result[26:]) + keyB)[0:16]) if (d == 0 || d-timestamp > 0) && string(result[10:26]) == Md5Sum(string(result[26:]) + keyB)[0:16] { return string(result[26:]) } fmt.Println(string(result[26:])) return "" } //MD5SUm func Md5Sum(str string) string { h := md5.New() io.WriteString(h, str) return fmt.Sprintf("%x", h.Sum(nil)) } //Base64Decode func Base64Decode(str string) []byte { var sdec []byte var err error x := len(str) * 3 % 4 fmt.Println(x) switch { case x == 2: str += "==" case x == 1: str += "=" } if sdec, err = base64.StdEncoding.DecodeString(str); err != nil { return sdec } return sdec }