Golang语言学习从入门到实战----go URL参数编码,解码与HMACSHA1加密算法

Hello,我是普通Gopher,00后男孩,极致的共享主义者,想要成为一个终身学习者。专注于做最通俗易懂的计算机基础知识类公众号。每天推送Golang技术干货,内容起于K8S而不止于K8S,涉及Docker、微服务、DevOps、数据库、虚拟化等云计算内容及SRE经验总结
=======================
初次见面,我为你准备了100G学习大礼包:
1、《百余本最新计算机电子图书》
2、《30G Golang学习视频》
3、《20G Java学习视频》
4、《90G Liunx高级学习视频》
5、《10G 算法(含蓝桥杯真题)学习视频》
6、《英语四级,周杰伦歌曲免费送!》
路过麻烦动动小手,点个关注,持续更新技术文章与资料!

go URL参数编解码

1. urlencode

golang下可以使用net/url模块实现urlencodeurldecode操作,类似java URLEncoder和URLDecoder的函数,它们是

  • QueryEscape:类似URLEncoder

  • QueryUnescape:类似URLDecoder

代码如下:

package main
import(
    "fmt"
    "net/url"
)
func main()  {
    var urlStr string = "www.baidu.com"
    escapeUrl := url.QueryEscape(urlStr)
    fmt.Println("编码:",escapeUrl)
    enEscapeUrl, _ := url.QueryUnescape(escapeUrl)
    fmt.Println("解码:",enEscapeUrl)
}

如果涉及到多个参数转码的,这在get和post请求中都有,比如id=100&method=get这样的。可以在通过url.Values进行增加后转码

package main
import (
	"fmt"
	"net/url"
)
func main() {
	params := url.Values{}
	params.Add("name", "zhangsan")
	params.Add("method", "get")
	fmt.Println(params.Encode())
}
#输出:
method=get&name=zhangsan

同样的,我们通过url的其他函数处理操作过后,一个典型的get请求的URL如下:

package main
import (
	"fmt"
	"net/url"
)
func main() {
	// Let's start with a base url
	baseUrl, err := url.Parse("http://www.baidu.com")
	if err != nil {
		fmt.Println("Malformed URL: ", err.Error())
		return
	}
	// Add a Path Segment (Path segment is automatically escaped)
	baseUrl.Path += "path with?reserved characters"
	// Prepare Query Parameters
	params := url.Values{}
	params.Add("id", "100")
	params.Add("method", "get")
	// Add Query Parameters to the URL
	baseUrl.RawQuery = params.Encode() // Escape Query Parameters
	fmt.Printf("Encoded URL is %q\n", baseUrl.String())
}

#输出结果
Encoded URL is "http://www.baidu.com/path%20with%3Freserved%20characters?id=100&method=get"

2. urldecode

简单的url解码,直接使用Unescape就可以了,如下:

package main
import (
	"fmt"
	"log"
	"net/url"
)
func main() {
	encodedValue := "Hell%C3%B6+W%C3%B6rld%40Golang"
	decodedValue, err := url.QueryUnescape(encodedValue)
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Println(decodedValue)
}

带form参数,就像上面提到的"param1=value¶m2=value2"这种格式的可以使用url.ParseQuery()参数解析成map[string][]string格式,如下:

package main
import (
	"fmt"
	"log"
	"net/url"
)
func main() {
	queryStr := "name=zhang%20san&id=%201&method=%20get"
	params, err := url.ParseQuery(queryStr)
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Println("Query Params: ")
	for key, value := range params {
		fmt.Printf("  %v = %v\n", key, value)
	}
}

其输出为:

Query Params: 
  name = [zhang san]
  id = [ 1]
  method = [ get]

一个get请求类,后面带参数的URL,可以通过如下方式解析并解码

package main
import (
	"fmt"
	"log"
	"net/url"
)
func main() {
	u, err := url.Parse("https://www.baidu.com/v1?name=zhang%20san&id=%20100&method=%20get")
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Println("Scheme: ", u.Scheme)
	fmt.Println("Host: ", u.Host)
	queries := u.Query()
	fmt.Println("Query Strings: ")
	for key, value := range queries {
		fmt.Printf("  %v = %v\n", key, value)
	}
	fmt.Println("Path: ", u.Path)
}

输出如下:

Scheme:  https
Host:  www.baidu.com
Query Strings: 
  id = [ 100]
  method = [ get]
  name = [zhang san]
Path:  /v1

go HMACSHA1加密算法

SHA1加密:SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所NIST发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

HMACSHA1是从 SHA1 哈希函数构造的一种键控哈希算法, 此 HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。 输出的哈希值长度与SHA-1一致

总的来说,两者具体区别好像就是HMACSHA1加密需要密钥,而SHA1不需要。如果有大佬知道其它的区别,麻烦一定要留言告知。

这次主要是用Golang实现了HMACSHA1加密方法,通过公共密钥生成散列值并与调用方传来的散列值进行对比,以此确保数据的安全性。
实现代码:

/*
//  keyStr 密钥
//  value  消息内容
*/
func HmacSha1(value, keyStr string) string{
	// Crypto by HMAC-SHA1
	key := []byte(keyStr)
	mac := hmac.New(sha1.New, key)
	mac.Write([]byte(value))

	//进行base64编码
	return base64.StdEncoding.EncodeToString(mac.Sum(nil))
}

你可能感兴趣的:(Golang,go,hmac)