{"id":4130,"date":"2018-10-23T08:12:35","date_gmt":"2018-10-23T00:12:35","guid":{"rendered":"https:\/\/ixyzero.com\/blog\/?p=4130"},"modified":"2018-10-23T08:12:35","modified_gmt":"2018-10-23T00:12:35","slug":"go%e8%af%ad%e8%a8%80%e5%ad%a6%e4%b9%a03-%e5%8a%a0%e8%a7%a3%e5%af%86%e3%80%81%e5%93%88%e5%b8%8c%e6%93%8d%e4%bd%9c","status":"publish","type":"post","link":"https:\/\/ixyzero.com\/blog\/archives\/4130.html","title":{"rendered":"Go\u8bed\u8a00\u5b66\u4e60#3-\u52a0\u89e3\u5bc6\u3001\u54c8\u5e0c\u64cd\u4f5c"},"content":{"rendered":"<p>=Start=<\/p>\n<h4 id=\"id-\u6a21\u677f-\u7f18\u7531\uff1a\">\u7f18\u7531\uff1a<\/h4>\n<p>\u6700\u8fd1\u5728\u8ddf\u7740\u90dd\u6797\u8001\u5e08\u7684\u300aGo\u8bed\u8a00\u6838\u5fc336\u8bb2\u300b\u8fd9\u95e8\u8bfe\u7a0b\u91cd\u62feGo\u8bed\u8a00\u5b66\u4e60\uff08\u4e4b\u524d\u572815\u5e74\u7684\u65f6\u5019\u6211\u81ea\u5b66\u8fc7\u4e00\u6bb5\u65f6\u95f4\uff0c\u4e0d\u8fc7\u540e\u6765\u6ca1\u600e\u4e48\u7528Go\u6765\u5199\u4ee3\u7801\uff0c\u6240\u4ee5\u6709\u4e9b\u5185\u5bb9\u90fd\u5fd8\u4e86\uff0c\u8fd9\u6b21\u5e0c\u671b\u80fd\u575a\u6301\u4e0b\u53bb\uff09\uff0c\u6240\u4ee5\u51c6\u5907\u628a\u4e00\u4e9b\u5e38\u89c1\u529f\u80fd\u7528Go\u8bed\u8a00\u8bd5\u7740\u5b9e\u8df5\u4e00\u904d\uff0c\u52a0\u5f3a\u5b66\u4e60\u6548\u679c\u548c\u5bf9\u8fd9\u95e8\u8bed\u8a00\u7684\u611f\u89c9\u3002<\/p>\n<h4 id=\"id-\u6a21\u677f-\u6b63\u6587\uff1a\">\u6b63\u6587\uff1a<\/h4>\n<h5 id=\"id-\u6a21\u677f-\u53c2\u8003\u89e3\u7b54\uff1a\">\u53c2\u8003\u89e3\u7b54\uff1a<\/h5>\n<h6>Go \u8bed\u8a00\u4e2d\u5982\u4f55\u5bf9<span style=\"color: #ff0000;\">\u5b57\u7b26\u4e32<\/span>\u8fdb\u884cSHA-1\/MD5\u7b49Hash\u64cd\u4f5c\uff1f<\/h6>\n<pre class=\"lang:default decode:true\">package main\r\n\r\nimport (\r\n    \"crypto\/sha1\"\r\n    \"encoding\/hex\"\r\n    \"fmt\"\r\n    \"io\"\r\n)\r\n\r\nfunc main() {\r\n    \/\/ \u4e0d\u8bba\u662fsha1\u8fd8\u662fmd5\uff0c\u6c42Hash\u90fd\u662f\u5148 New() \u7136\u540e\u518d Write() \u6700\u540e Sum()\r\n    s := \"hash this string\"\r\n    h := sha1.New()\r\n    h.Write([]byte(s))\r\n\r\n    fmt.Printf(\"%x\\n\", h.Sum(nil))\r\n\r\n    \/\/ sha1_hash := hex.EncodeToString(h.Sum(nil))\r\n    \/\/ fmt.Println(sha1_hash)\r\n    fmt.Println(hex.EncodeToString(h.Sum(nil)))\r\n\r\n\r\n    \/\/ \u4f7f\u7528 io.WriteString \u5c06\u5b57\u7b26\u4e32\u5199\u5165\uff0c\u800c\u4e0d\u662f\u7528 []byte(string_here) \u8fdb\u884c\u8f6c\u6362\r\n    h5 := sha1.New()\r\n    io.WriteString(h5, \"hash this string\")\r\n    fmt.Printf(\"%x\\n\", h5.Sum(nil))\r\n}<\/pre>\n<h6>Go \u8bed\u8a00\u4e2d\u5982\u4f55\u5bf9<span style=\"color: #ff0000;\">\u6587\u4ef6<\/span>\u8fdb\u884cSHA-1\/MD5\u7b49Hash\u64cd\u4f5c\uff1f<\/h6>\n<pre class=\"lang:default decode:true\">package main\r\n\r\nimport (\r\n    \"crypto\/sha1\"\r\n    \"fmt\"\r\n    \"io\"\r\n    \"log\"\r\n    \"os\"\r\n)\r\n\r\nfunc main() {\r\n    f, err := os.Open(\"file.txt\")\r\n    if err != nil {\r\n        log.Fatal(err)\r\n    }\r\n    defer f.Close()\r\n\r\n    h := sha1.New()\r\n    if _, err := io.Copy(h, f); err != nil {\r\n        log.Fatal(err)\r\n    }\r\n\r\n    fmt.Printf(\"%x\", h.Sum(nil))\r\n\r\n}\r\n<\/pre>\n<h6>Go \u8bed\u8a00\u4e2d\u5982\u4f55\u5bf9\u5b57\u7b26\u4e32\u8fdb\u884cAES\u52a0\u89e3\u5bc6\uff1f<\/h6>\n<pre class=\"lang:default decode:true \">package main\r\n\r\nimport (\r\n    \"crypto\/aes\"\r\n    \"crypto\/cipher\"\r\n    \"crypto\/rand\"\r\n    \"encoding\/base64\"\r\n    \"errors\"\r\n    \"fmt\"\r\n    \"io\"\r\n    \"log\"\r\n)\r\n\r\nfunc main() {\r\n    key := []byte(\"a very very very very secret key\") \/\/ 32 bytes\r\n    plaintext := []byte(\"some really really really long plaintext\")\r\n    fmt.Printf(\"%s\\n\", plaintext)\r\n    ciphertext, err := encrypt(key, plaintext)\r\n    if err != nil {\r\n        log.Fatal(err)\r\n    }\r\n    fmt.Printf(\"%0x\\n\", ciphertext)\r\n    result, err := decrypt(key, ciphertext)\r\n    if err != nil {\r\n        log.Fatal(err)\r\n    }\r\n    fmt.Printf(\"%s\\n\", result)\r\n}\r\n\r\n\/\/ See alternate IV creation from ciphertext below\r\n\/\/var iv = []byte{35, 46, 57, 24, 85, 35, 24, 74, 87, 35, 88, 98, 66, 32, 14, 05}\r\n\r\nfunc encrypt(key, text []byte) ([]byte, error) {\r\n    block, err := aes.NewCipher(key)\r\n    if err != nil {\r\n        return nil, err\r\n    }\r\n    b := base64.StdEncoding.EncodeToString(text)\r\n    ciphertext := make([]byte, aes.BlockSize+len(b))\r\n    iv := ciphertext[:aes.BlockSize]\r\n    if _, err := io.ReadFull(rand.Reader, iv); err != nil {\r\n        return nil, err\r\n    }\r\n    cfb := cipher.NewCFBEncrypter(block, iv)\r\n    cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b))\r\n    return ciphertext, nil\r\n}\r\n\r\nfunc decrypt(key, text []byte) ([]byte, error) {\r\n    block, err := aes.NewCipher(key)\r\n    if err != nil {\r\n        return nil, err\r\n    }\r\n    if len(text) &lt; aes.BlockSize {\r\n        return nil, errors.New(\"ciphertext too short\")\r\n    }\r\n    iv := text[:aes.BlockSize]\r\n    text = text[aes.BlockSize:]\r\n    cfb := cipher.NewCFBDecrypter(block, iv)\r\n    cfb.XORKeyStream(text, text)\r\n    data, err := base64.StdEncoding.DecodeString(string(text))\r\n    if err != nil {\r\n        return nil, err\r\n    }\r\n    return data, nil\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<h6>Go \u8bed\u8a00\u4e2d\u5982\u4f55\u5bf9\u5b57\u7b26\u4e32\u8fdb\u884cbase64\u7f16\u89e3\u7801\uff1f<\/h6>\n<ul>\n<li>func (enc *Encoding) <span style=\"color: #ff0000;\">EncodeToString<\/span>(src []byte) string<\/li>\n<li>func (enc *Encoding) <span style=\"color: #ff0000;\">DecodeString<\/span>(s string) ([]byte, error)<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true \">package main\r\n\r\nimport (\r\n    \"encoding\/base64\"\r\n    \"fmt\"\r\n)\r\n\r\nfunc main() {\r\n    msg := \"Hello, \u4e16\u754c\"\r\n    \/\/ base64 \u7f16\u7801\r\n    encoded := base64.StdEncoding.EncodeToString([]byte(msg))\r\n    fmt.Println(encoded) \/\/ SGVsbG8sIOS4lueVjA==\r\n\r\n    \/\/ base64 \u89e3\u7801\r\n    decoded, err := base64.StdEncoding.DecodeString(encoded)\r\n    if err != nil {\r\n        fmt.Println(\"decode error:\", err)\r\n        return\r\n    }\r\n    fmt.Println(string(decoded)) \/\/ Hello, \u4e16\u754c\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<h5 id=\"id-\u6a21\u677f-\u53c2\u8003\u94fe\u63a5\uff1a\">\u53c2\u8003\u94fe\u63a5\uff1a<\/h5>\n<ul>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/18817336\/golang-encrypting-a-string-with-aes-and-base64\">Go \u8bed\u8a00\u4e2d\u5982\u4f55\u5bf9\u5b57\u7b26\u4e32\u8fdb\u884cAES\u52a0\u89e3\u5bc6\u548cbase64\u7f16\u7801\uff1f<\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/10701874\/generating-the-sha-hash-of-a-string-using-golang\">Go \u8bed\u8a00\u4e2d\u5982\u4f55\u5bf9\u5b57\u7b26\u4e32\u8fdb\u884cSHA-1\u54c8\u5e0c\u64cd\u4f5c\uff1f<\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/2377881\/how-to-get-a-md5-hash-from-a-string-in-golang\">Go \u8bed\u8a00\u4e2d\u5982\u4f55\u5bf9\u5b57\u7b26\u4e32\u8fdb\u884cMD5\u54c8\u5e0c\u64cd\u4f5c\uff1f<\/a><\/li>\n<li><a href=\"http:\/\/golang.org\/pkg\/crypto\/md5\/#New\">http:\/\/golang.org\/pkg\/crypto\/md5\/#New<\/a><\/li>\n<\/ul>\n<p>=END=<\/p>\n","protected":false},"excerpt":{"rendered":"<p>=Start= \u7f18\u7531\uff1a \u6700\u8fd1\u5728\u8ddf\u7740\u90dd\u6797\u8001\u5e08\u7684\u300aGo\u8bed\u8a00\u6838\u5fc336\u8bb2\u300b\u8fd9\u95e8\u8bfe\u7a0b\u91cd\u62feGo\u8bed\u8a00\u5b66\u4e60\uff08\u4e4b\u524d\u572815\u5e74\u7684\u65f6\u5019 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,7,12],"tags":[369,564,814,1236],"class_list":["post-4130","post","type-post","status-publish","format-standard","hentry","category-knowledgebase-2","category-programing","category-tools","tag-base64","tag-golang","tag-md5","tag-sha1"],"views":2911,"_links":{"self":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/4130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/comments?post=4130"}],"version-history":[{"count":1,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/4130\/revisions"}],"predecessor-version":[{"id":4131,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/4130\/revisions\/4131"}],"wp:attachment":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/media?parent=4130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/categories?post=4130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/tags?post=4130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}