<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>山山仙人博客</title>
        <link>https://www.ssgeek.com/</link>
        <description>山山仙人的个人博客，分享技术、生活和爱好</description>
        <lastBuildDate>Sun, 08 Feb 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <copyright>Copyright © 2018 - 2026 SSgeek. Built with Docusaurus.</copyright>
        <item>
            <title><![CDATA[自己动手实现NAS公网访问]]></title>
            <link>https://www.ssgeek.com/blog/nas-public-access</link>
            <guid>https://www.ssgeek.com/blog/nas-public-access</guid>
            <pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[自己动手实现NAS公网访问，让家里的NAS设备在外网也能访问，既方便又安全]]></description>
            <content:encoded><![CDATA[<p>自己动手实现NAS公网访问，让家里的NAS设备在外网也能访问，既方便又安全</p>
<!-- -->
]]></content:encoded>
            <category>NAS</category>
            <category>VPN</category>
        </item>
        <item>
            <title><![CDATA[我的2024-2025]]></title>
            <link>https://www.ssgeek.com/blog/wo-de-2024-2025</link>
            <guid>https://www.ssgeek.com/blog/wo-de-2024-2025</guid>
            <pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[2024-2025年度总结]]></description>
            <content:encoded><![CDATA[<p>2024-2025年度总结</p>
<p><img decoding="async" loading="lazy" alt="my_2024_2025_00" src="https://www.ssgeek.com/assets/images/my_2024_2025_00-78d3a3bd73b3aaf5e24a900a23b2221b.png" width="1920" height="1280" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="开篇">开篇<a href="https://www.ssgeek.com/blog/wo-de-2024-2025#%E5%BC%80%E7%AF%87" class="hash-link" aria-label="开篇的直接链接" title="开篇的直接链接" translate="no">​</a></h2>
<p>人生最大的遗憾，是一个人无法同时拥有青春和对青春的感受。</p>
<p>“种完麦子我就往南走”，这是近两年感悟较深的一句话，一位来自于“麦子阿姨”的故事。我们常常说来一次说走就走的旅行，但实际上大多数人都无法做到。生活中总有各种各样的牵绊，让我们无法轻易地放下手中的一切，去追寻内心的渴望。</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="流年">流年<a href="https://www.ssgeek.com/blog/wo-de-2024-2025#%E6%B5%81%E5%B9%B4" class="hash-link" aria-label="流年的直接链接" title="流年的直接链接" translate="no">​</a></h2>
<p>2024-2025 是来北京的第6、7个年头，也是本科毕业的第5、6年，应该说是北漂已经7年了，离高中毕业已经整整10年了。时间过得飞快，转眼间又过去了两年。对于时间的流逝之快，这两年感觉尤为明显，快到有时候需要用笔签字写日期的那一刻都会写错年份~</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="工作">工作<a href="https://www.ssgeek.com/blog/wo-de-2024-2025#%E5%B7%A5%E4%BD%9C" class="hash-link" aria-label="工作的直接链接" title="工作的直接链接" translate="no">​</a></h2>
<p>在25年年初，迎来了职业生涯的再次跳槽。经过深思熟虑，我决定开始新的挑战与机遇。在前司工作了接近三年半的时间，这段经历让我积累和思考了不少关于技术路线与职场等方面的经验与认知。</p>
<p>如何判断一个工作是否适合你，或者说什么是你期望的好工作？我认为，能赚钱、干得开心、能学到东西，同时满足这三点的工作，就是好工作。曾经与一位实习生同事交流时也提到这点，他非常认同。当然了，在现在的就业市场环境下，找到一份同时满足这三点的工作并不容易，很多时候需要靠运气以及在其中做出不断地权衡取舍。</p>
<p>另外重要的一方面，能够在工作中不断接收新的挑战与任务，学以致用，通过自己的努力去完成它们，是个人职业成长、技术提升、心态成熟的关键。</p>
<p>这几年，随着AI技术的迅猛发展，尤其是大模型的兴起，整个技术领域都发生了翻天覆地的变化。国内外都诞生了不少和AI相关的新兴公司和岗位。作为一名技术人员，保持对新技术的敏感度和学习能力显得尤为重要。对个人职业方向而言，AI Infra、AIOps等相关领域无疑是未来发展的重要方向。在未来的工作中，希望能够更多地靠拢这些前沿技术领域，提升自己的竞争力和适应能力。</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="生活">生活<a href="https://www.ssgeek.com/blog/wo-de-2024-2025#%E7%94%9F%E6%B4%BB" class="hash-link" aria-label="生活的直接链接" title="生活的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="出游">出游<a href="https://www.ssgeek.com/blog/wo-de-2024-2025#%E5%87%BA%E6%B8%B8" class="hash-link" aria-label="出游的直接链接" title="出游的直接链接" translate="no">​</a></h3>
<p>生活上，这两年系统地完成了我们小俩口的一些旅游与出行计划，这两年去了新加坡、泰国、张家口、大同、青岛、苏州、上海、宁夏、内蒙热阿-达达线等地，完成了两次境外旅游（这也是头一次出国旅游）以及多次北京周边的自驾游。旅行的意义不仅在于看风景，更在于体验不同的风土人情，感受这个世界的多样性和美好。</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="运动">运动<a href="https://www.ssgeek.com/blog/wo-de-2024-2025#%E8%BF%90%E5%8A%A8" class="hash-link" aria-label="运动的直接链接" title="运动的直接链接" translate="no">​</a></h3>
<p>这两年公路自行车骑行的频率有所下降，但依然保持着在天气合适的情况下坚持骑行的习惯。骑行不仅锻炼了身体，也让我在忙碌的工作之余找到了一种放松的方式。通过骑行，我感受到了风的速度和自由的感觉，这种感觉是无法用言语表达的。</p>
<p>在2024年9月底，和朋友一起完成了北京-天津的单日往返骑行，总骑行里程实际约220公里。这是自行车骑行以来的最长距离挑战，虽然过程艰辛，但最终的成就感让我难以忘怀，也算是对自己的一次挑战和突破，完成了人生中的一个小目标，不留遗憾。</p>
<p><img decoding="async" loading="lazy" alt="my_2024_2025_01" src="https://www.ssgeek.com/assets/images/my_2024_2025_01-320e2f5f7132168e16099eccbe285d56.png" width="1130" height="1194" class="img_ev3q"></p>
<p>从24年年中开始，我养成了跑步与健身的习惯。25年入冬以来，骑行次数减少，更多地进行了室内的跑步锻炼，这也是我找到的一种能调整自我状态的不错方式。</p>
<p><img decoding="async" loading="lazy" alt="my_2024_2025_03" src="https://www.ssgeek.com/assets/images/my_2024_2025_03-07aa181bb65c722ea3d444590d1a1691.jpg" width="1320" height="3263" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="其他">其他<a href="https://www.ssgeek.com/blog/wo-de-2024-2025#%E5%85%B6%E4%BB%96" class="hash-link" aria-label="其他的直接链接" title="其他的直接链接" translate="no">​</a></h3>
<p>这两年身边的同学陆陆续续都结束北漂离开了北京，这是感受最为深切的，不知道自己会在北京待多久，但目前来看，还是希望能多待几年，毕竟这里有更多的机会和资源。</p>
<p>送别了离开北京的同学朋友，也迎来了新朋友，结识了Mia、老王哥、小有财等新朋友，感恩生活中遇到的每一个人。</p>
<p>新的一年我们一起解锁了第一次 Live House 方式的跨年，和年轻的小鲜肉们一起摇摆到凌晨，感受到了不一样的跨年氛围。</p>
<p><img decoding="async" loading="lazy" alt="my_2024_2025_02" src="https://www.ssgeek.com/assets/images/my_2024_2025_02-4008df1704302a5a579448d8c4744a6f.jpg" width="1706" height="1279" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="最后">最后<a href="https://www.ssgeek.com/blog/wo-de-2024-2025#%E6%9C%80%E5%90%8E" class="hash-link" aria-label="最后的直接链接" title="最后的直接链接" translate="no">​</a></h2>
<p>回首过去的两年，感恩生活中的点点滴滴，感恩遇到的每一个充满善意与温暖的人，感恩自己依然保持着对生活的热爱与追求。</p>
<p>你想成为怎样的人，过怎样的生活，只要你不后悔就行。并不是所有人都能在早上七点钟起床的，也别拿一碗饭来衡量一个人胃口的大小。有的人喜欢狼吞虎咽，有的人喜欢细嚼慢咽，允许别人做别人，也允许自己做自己，一岁有一岁的味道，一站有一站的风景，跟着自己的心走就好。不是所有选择都必须要做出正确选项的，只要你想，你可以选择你喜欢的选项，沿途的花会一直开，以后的路也是，祝你也祝我。</p>
<p>30岁后见，老己~</p>]]></content:encoded>
            <category>年度总结</category>
        </item>
        <item>
            <title><![CDATA[个人养老金年化收益计算]]></title>
            <link>https://www.ssgeek.com/blog/personal-pension-annual-yield-calculation</link>
            <guid>https://www.ssgeek.com/blog/personal-pension-annual-yield-calculation</guid>
            <pubDate>Tue, 06 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[个人养老金年化收益计算小工具]]></description>
            <content:encoded><![CDATA[<p>个人养老金年化收益计算小工具</p>
<!-- -->
]]></content:encoded>
            <category>Finance</category>
            <category>Tool</category>
        </item>
        <item>
            <title><![CDATA[Apple Container实践]]></title>
            <link>https://www.ssgeek.com/blog/apple-container-practice</link>
            <guid>https://www.ssgeek.com/blog/apple-container-practice</guid>
            <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Apple Container 是苹果公司推出的容器化技术，专门为 macOS 平台设计]]></description>
            <content:encoded><![CDATA[<p><code>Apple Container</code> 是苹果公司推出的容器化技术，专门为 <code>macOS</code> 平台设计</p>
<!-- -->
]]></content:encoded>
            <category>Container</category>
            <category>Apple</category>
            <category>macOS</category>
        </item>
        <item>
            <title><![CDATA[Mermaid 语法概要]]></title>
            <link>https://www.ssgeek.com/blog/mermaid-yu-fa-gai-yao</link>
            <guid>https://www.ssgeek.com/blog/mermaid-yu-fa-gai-yao</guid>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Mermaid 是一种基于文本的图表和图形绘制工具，允许用户使用简单的标记语言来创建复杂的图表]]></description>
            <content:encoded><![CDATA[<p>Mermaid 是一种基于文本的图表和图形绘制工具，允许用户使用简单的标记语言来创建复杂的图表</p>
<!-- -->
]]></content:encoded>
            <category>WireGuard</category>
            <category>VPN</category>
        </item>
        <item>
            <title><![CDATA[组建WireGuard网络]]></title>
            <link>https://www.ssgeek.com/blog/zu-jian-wireguard-wang-luo</link>
            <guid>https://www.ssgeek.com/blog/zu-jian-wireguard-wang-luo</guid>
            <pubDate>Fri, 29 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[WireGuard是一种近几年新开源的现代化VPN协议，具有高效、轻量和易于配置的特点]]></description>
            <content:encoded><![CDATA[<p>WireGuard是一种近几年新开源的现代化VPN协议，具有高效、轻量和易于配置的特点</p>
<!-- -->
]]></content:encoded>
            <category>WireGuard</category>
            <category>VPN</category>
        </item>
        <item>
            <title><![CDATA[使用GitHub存储Helm包]]></title>
            <link>https://www.ssgeek.com/blog/shi-yong-github-cun-chu-helm-bao</link>
            <guid>https://www.ssgeek.com/blog/shi-yong-github-cun-chu-helm-bao</guid>
            <pubDate>Thu, 28 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[目前在GitHub上支持两种不同格式的Helm包存储方式]]></description>
            <content:encoded><![CDATA[<p>目前在GitHub上支持两种不同格式的Helm包存储方式</p>
<!-- -->
]]></content:encoded>
            <category>Helm</category>
            <category>GitHub</category>
            <category>包管理</category>
        </item>
        <item>
            <title><![CDATA[详解Nginx获取客户端真实IP]]></title>
            <link>https://www.ssgeek.com/blog/xiang-jie-nginx-huo-qu-ke-hu-duan-zhen-shi-ip</link>
            <guid>https://www.ssgeek.com/blog/xiang-jie-nginx-huo-qu-ke-hu-duan-zhen-shi-ip</guid>
            <pubDate>Wed, 27 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[本文详细介绍如何配置 Nginx 以正确获取客户端的真实 IP 地址]]></description>
            <content:encoded><![CDATA[<p>本文详细介绍如何配置 Nginx 以正确获取客户端的真实 IP 地址</p>
<!-- -->
]]></content:encoded>
            <category>Nginx</category>
            <category>代理服务器</category>
            <category>真实IP</category>
        </item>
        <item>
            <title><![CDATA[生如夏花——与技术人的精神远游]]></title>
            <link>https://www.ssgeek.com/blog/sheng-ru-xia-hua-yu-ji-shu-ren-de-jing-shen-yuan-you</link>
            <guid>https://www.ssgeek.com/blog/sheng-ru-xia-hua-yu-ji-shu-ren-de-jing-shen-yuan-you</guid>
            <pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[———纪念左耳朵耗子]]></description>
            <content:encoded><![CDATA[<p>———纪念左耳朵耗子</p>
<blockquote>
<p>早上通勤路上，看到有文章提到耗子叔，便立马想起2年前耗子叔离世时自己拟下的本文标题，却迟迟未动笔。
落笔之日，适逢耗子叔离世二周年。</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="与技术人的精神远游">与技术人的精神远游<a href="https://www.ssgeek.com/blog/sheng-ru-xia-hua-yu-ji-shu-ren-de-jing-shen-yuan-you#%E4%B8%8E%E6%8A%80%E6%9C%AF%E4%BA%BA%E7%9A%84%E7%B2%BE%E7%A5%9E%E8%BF%9C%E6%B8%B8" class="hash-link" aria-label="与技术人的精神远游的直接链接" title="与技术人的精神远游的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="20250514-01" src="https://www.ssgeek.com/assets/images/20250514-01-c432381f523dce6e393dade649d27a8e.png" width="980" height="420" class="img_ev3q"></p>
<p>最早接触左耳朵耗子，是在大学时间折腾 Linux 时，误打误撞访问到耗子叔的博客 CoolShell，当时便被耗子叔的技术才华所吸引，于是便一直关注。</p>
<p>大学毕业参加工作，圈子与认知都在不断发生变化，譬如技术圈子的人彼时应该都用过或听过极客时间，而极客时间当时最为出名的便是耗子叔的专栏——《左耳听风》。</p>
<p>后来得知在此之前，耗子叔已有过相关著作《程序员的练级攻略》。</p>
<p>再后来与耗子叔有交集，是学习<a href="https://mp.weixin.qq.com/s/dakrue_Z8Nt5CD6NId_KZw" target="_blank" rel="noopener noreferrer" class="">浅谈 Prometheus 的数据存储</a>时，参考到耗子叔的创业公司 MegaEase 的<a href="https://www.bilibili.com/video/BV1a64y1X7ys" target="_blank" rel="noopener noreferrer" class="">B站Up主视频</a>。</p>
<p><strong>芝兰生于空谷，不以无人而不芳</strong>。这是耗子叔的座右铭，也是他一生的写照。</p>
<p><img decoding="async" loading="lazy" alt="20250514-02" src="https://www.ssgeek.com/assets/images/20250514-02-5e7c84e4aa4ab5761e8f878bbff3556c.png" width="1080" height="538" class="img_ev3q"></p>
<p>耗子叔的博客文章从 2004年开始，到 2023年结束，整整 19年，作为一个技术人，能坚持如此长时间输出高质量内容，实属不易。反观自己，又能坚持到何时？</p>
<p>2023年惊闻耗子叔离世，当时便觉得惋惜，一个技术圈的传奇人物就这样离世了。在当今技术圈，像他这样既深耕技术又贴近现实的引路人，已然难觅踪影。这个时代从不缺乏励志故事和成功典范，但真正能体察普通工程师的困境，并指明切实可行路径的导师却寥寥无几。那些站在聚光灯下的成功人士，往往难以理解普通从业者面临的真实挑战，他们或许不曾体会过缺乏资源和支持的处境。</p>
<p>互联网时代信息泛滥，但经得起时间沉淀的内容屈指可数。耗子叔的诸多洞见，纵使岁月流转，依然能为后来者提供清晰的指引和持续的动力。他的文字如同技术人的精神坐标，无论何时重读，都能让人重新找到前行的方向。我想，技术人的生命价值或许在于：我们写的每一行代码，解决的每一个问题，分享的每一篇心得，都可能成为他人前进路上的垫脚石。就像耗子叔留给我们的精神遗产——那些深入浅出的技术解析，那些发人深省的职业思考，那些历经岁月仍熠熠生辉的真知灼见。</p>
<p>附上一个代码仓库<a href="https://github.com/megaease/Remembering-Haoel" target="_blank" rel="noopener noreferrer" class="">Remembering-Haoel</a>，记录了一些与耗子叔认识、打过交道的人和事。</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="生如夏花">生如夏花<a href="https://www.ssgeek.com/blog/sheng-ru-xia-hua-yu-ji-shu-ren-de-jing-shen-yuan-you#%E7%94%9F%E5%A6%82%E5%A4%8F%E8%8A%B1" class="hash-link" aria-label="生如夏花的直接链接" title="生如夏花的直接链接" translate="no">​</a></h2>
<p>耗子叔的离世，加上之前的疫情、以及这几年身边逝去的亲人，促使我不断思考生命的意义。当我们离开时，希望留下怎样的精神遗产？</p>
<p>这种思考并非为了迎合他人眼光，而是帮助我们厘清内心真正珍视的价值。</p>
<p>生命像一场无法回放的直播，没有彩排，没有重来。我们总以为来日方长，却忘了世事无常。那些计划中的旅行，那些想说却未说出口的话，那些被"等有空再说"推迟的相聚，都可能在某一个平凡的午后，永远失去实现的机会。</p>
<p>在日复一日的忙碌中，我们常常忘记生命最本真的模样。清晨的露珠，午后的蝉鸣，傍晚的晚霞，这些最平凡的自然馈赠，往往被我们视而不见。直到某天，当我们突然失去感受这些美好的能力时，才惊觉生命中最珍贵的，从来都不是那些我们拼命追逐的东西。</p>
<p>当我们终将离开时，带不走的不是名利与成就，而是那些曾经温暖过他人的时刻，那些让世界变得更美好的微小改变。“生如夏花之绚烂，死如秋叶之静美”。生命的意义不在于长度，而在于我们是否真正活出了自己的色彩。</p>]]></content:encoded>
            <category>生活</category>
            <category>随笔</category>
        </item>
        <item>
            <title><![CDATA[Ack集群Pod独占EIP实践]]></title>
            <link>https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian</link>
            <guid>https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian</guid>
            <pubDate>Mon, 29 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[引入一个实际生产环境案例，介绍在阿里云Ack集群中如何实现Pod独占公网EIP]]></description>
            <content:encoded><![CDATA[<p>引入一个实际生产环境案例，介绍在阿里云Ack集群中如何实现Pod独占公网EIP</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="背景">背景<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="背景的直接链接" title="背景的直接链接" translate="no">​</a></h2>
<p>某线上应用部署在<code>ack</code>集群内，用于根据用户定义的<code>http</code>请求项配置，周期性检查<code>http</code>接口的请求响应状态，接口地址为内网或公网，当接口地址为公网时，频繁出现请求超时的报警错误。经过排查发现，在公网请求发生超时的时刻，集群<code>vpc NAT</code>带宽达到上限<code>200Mbps</code>，也就是<code>25MB/s</code></p>
<p><img decoding="async" loading="lazy" alt="20240429-01" src="https://www.ssgeek.com/assets/images/20240429-01-b4cfa64d6dc85903893c3497dd059cd8.jpg" width="1280" height="668" class="img_ev3q"></p>
<p>分析：由于集群占用<code>vpc</code>，<code>vpc</code>内所有<code>ip</code>（node和pod的ip）都属于<code>vpc</code>内各子网地址，这些地址出公网的请求共用<code>vpc</code>绑定的公网<code>NAT</code>，在某时刻子网<code>ip</code>请求公网使用的<code>EIP</code>是随机的，无法控制，会产生和其他<code>ip</code>同时请求公网使用同一个<code>EIP</code>的情况，由此发生了带宽内拥挤，超限的情况，因此上述超时报警其实是<strong>客户端带宽不够产生的误报</strong></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="解决方案">解决方案<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" class="hash-link" aria-label="解决方案的直接链接" title="解决方案的直接链接" translate="no">​</a></h2>
<p>为了避免发生上述情况，解决办法是避免这些特定的pod请求公网时和其他ip发生公网带宽的争抢，走独立的公网出口，有以下两种方案：</p>
<ul>
<li class="">方案一</li>
</ul>
<p>将这些<code>pod</code>调度到特定的子网<code>node</code>，<code>node</code>的<code>ip</code>和<code>pod</code>的<code>ip</code>会使用特定的子网，这个特定的子网由于在特定的<code>vSwitch</code>虚拟交换机下，因此可以为这个子网单独指定路由条目，也就是将请求公网地址的请求的下一跳路由到特定的公网<code>NAT</code>，特定的公网<code>NAT</code>使用特定的<code>EIP</code>且不和其他子网共用</p>
<ul>
<li class="">方案二</li>
</ul>
<p><code>ack</code>集群的网络使用的是阿里云<code>Terway</code>，在此前提下，阿里云提供了<a href="https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/associate-an-eip-with-a-pod-1#95a64c02c0f05" target="_blank" rel="noopener noreferrer" class="">为Terway网络中的Pod挂载独立的公网EIP</a>的解决方案，具体可以查看文档说明，简单来说就是<strong>阿里云提供了集群内的控制器，实现了通过k8s原生的声明式配置，调用EIP产品相关api动态为pod绑定EIP的功能</strong></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="方案选取和实现">方案选取和实现<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#%E6%96%B9%E6%A1%88%E9%80%89%E5%8F%96%E5%92%8C%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="方案选取和实现的直接链接" title="方案选取和实现的直接链接" translate="no">​</a></h2>
<p>方案一，改动较大，需要将<code>pod</code>调度到特定的<code>node</code>上，且需要人工维护路由条目，维护性较差；
方案二，更为直接，在安装控制器插件后，通过给<code>pod</code>添加特定注解实现目的，主要分为两种方式：</p>
<ul>
<li class="">一种是根据声明式配置动态随机购买EIP</li>
</ul>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">matchLabels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">annotations</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/pod-with-eip</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"true"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 自动创建并绑定EIP</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/eip-bandwidth</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"200"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># EIP峰值带宽</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/eip-internet-charge-type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"PayByTraffic"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># EIP的计量方式</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/eip-instance-charge-type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"PostPaid"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># EIP的计费方式</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/eip-name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"app-eip"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># EIP名称</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/eip-description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"app-eip"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># EIP描述</span><br></div></code></pre></div></div>
<ul>
<li class="">一种是先购买EIP，pod注解中声明EIP的id</li>
</ul>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">matchLabels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">annotations</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/pod-eip-instanceid</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> eip</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">2zeXXXXXx  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># EIP ID</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="配置ram策略并安装插件">配置RAM策略并安装插件<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#%E9%85%8D%E7%BD%AEram%E7%AD%96%E7%95%A5%E5%B9%B6%E5%AE%89%E8%A3%85%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="配置RAM策略并安装插件的直接链接" title="配置RAM策略并安装插件的直接链接" translate="no">​</a></h3>
<p>按照文档操作，配置挂载EIP所需的RAM权限
安装插件<code>ack-extend-network-controller</code>，安装时启用插件<code>pod eip</code>的能力，一键安装即可</p>
<p><img decoding="async" loading="lazy" alt="20240429-02" src="https://www.ssgeek.com/assets/images/20240429-02-57a411285cdf451e598409bfc2a52037.jpg" width="1280" height="772" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="购买eip">购买EIP<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#%E8%B4%AD%E4%B9%B0eip" class="hash-link" aria-label="购买EIP的直接链接" title="购买EIP的直接链接" translate="no">​</a></h3>
<p>由于业务目前只有<code>1</code>个<code>pod</code>，为了后续排查方便，选择通过先购买<code>EIP</code>再根据<code>EIP id</code>绑定的方式
购买<code>EIP</code>，按量付费，带宽上限为<code>200Mbps</code></p>
<p><img decoding="async" loading="lazy" alt="20240429-03" src="https://www.ssgeek.com/assets/images/20240429-03-b6cfaa5cbe2224d1ff4b47c4bdccbb8d.jpg" width="2594" height="966" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="为pod添加注解">为pod添加注解<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#%E4%B8%BApod%E6%B7%BB%E5%8A%A0%E6%B3%A8%E8%A7%A3" class="hash-link" aria-label="为pod添加注解的直接链接" title="为pod添加注解的直接链接" translate="no">​</a></h3>
<p>在<code>deployment</code>的<code>yaml</code>中为<code>pod</code>添加注解，根据<code>EIP id</code>绑定这个<code>EIP</code>即可</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">annotations</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/pod-eip-instanceid</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> eip</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">xxx</span><br></div></code></pre></div></div>
<p>绑定后效果</p>
<ul>
<li class="">集群cr</li>
</ul>
<p>控制器会自动创建一个和<code>pod</code>名称相同的<code>PodEIP</code>的<code>cr</code>，从这个<code>cr</code>的<code>status</code>中可以看到和上面购买的<code>EIP</code>相关的信息</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">~ kubectl get pods </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">o wide</span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token plain">grep app</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">79dcf755fb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">ks2ld                                       1/1     Running             0                47h     10.245.36.4      ack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">010245035222packets</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">spot       &lt;none</span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">           1/1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">~ kubectl get podeips app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">79dcf755fb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">ks2ld </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">o yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> alibabacloud.com/v1beta1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> PodEIP</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">creationTimestamp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"2024-04-01T07:55:46Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">finalizers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> podeip</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">controller.alibabacloud.com/finalizer</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">generation</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">79dcf755fb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">ks2ld</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dev</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">resourceVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"2389078403"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">uid</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 292773d3</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">80b4</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">4c88</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">b0ef</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">17f011a1530e</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">allocationID</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> eip</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">xxxxx</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">allocationType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">releaseStrategy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Follow</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Static</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">eipAddress</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 101.xxx.xxx.5</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">internetChargeType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> PayByTraffic</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">isp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> BGP</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> app独享</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">networkInterfaceID</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> eni</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">2zexxxxxxxqvrrpxxx</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">podLastSeen</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"2024-04-01T07:39:39Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">privateIPAddress</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 10.xxx.36.4</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">resourceGroupID</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> rg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">xxxxx5afyhf3xky</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> InUse</span><br></div></code></pre></div></div>
<ul>
<li class="">EIP绑定情况，与从集群查看cr得到的状态一致</li>
</ul>
<p><img decoding="async" loading="lazy" alt="20240429-04" src="https://www.ssgeek.com/assets/images/20240429-04-3444f4a71845594a6119aec4343e817f.jpg" width="2596" height="308" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="其他说明">其他说明<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#%E5%85%B6%E4%BB%96%E8%AF%B4%E6%98%8E" class="hash-link" aria-label="其他说明的直接链接" title="其他说明的直接链接" translate="no">​</a></h3>
<p>以上实现了<code>pod</code>绑定特定<code>EIP</code>的功能，在此条件下，<code>pod</code>请求公网时会固定为此<code>eip</code>出公网，为了保障配置的稳定，经过测试，上面提到此业务<code>pod</code>只有一个副本，且通过<code>deployment</code>管理，属于无状态应用，只做上面为<code>pod</code>添加注解的方式会有以下问题</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="如何控制当pod状态变为ready后才绑定eip">如何控制当pod状态变为ready后才绑定EIP？<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#%E5%A6%82%E4%BD%95%E6%8E%A7%E5%88%B6%E5%BD%93pod%E7%8A%B6%E6%80%81%E5%8F%98%E4%B8%BAready%E5%90%8E%E6%89%8D%E7%BB%91%E5%AE%9Aeip" class="hash-link" aria-label="如何控制当pod状态变为ready后才绑定EIP？的直接链接" title="如何控制当pod状态变为ready后才绑定EIP？的直接链接" translate="no">​</a></h4>
<p>控制器会在<code>Pod IP</code>分配后，为<code>Pod</code>配置<code>EIP</code>地址，<code>Pod Ready</code>状态可能早于<code>EIP</code>绑定成功时间。解决办法是为<code>pod</code>添加就绪前的检测</p>
<ul>
<li class="">一种方式是为Pod配置Readiness gates</li>
</ul>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Pod</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">readinessGates</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">conditionType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"k8s.aliyun.com/eip"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">conditions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">lastProbeTime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"2022-12-12T03:45:48Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">lastTransitionTime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"2022-12-12T03:45:48Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">reason</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Associate eip succeed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> "True"type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> k8s.aliyun.com/eip</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">...</span><br></div></code></pre></div></div>
<ul>
<li class="">一种方式是为Pod配置init container，在init container中检查EIP是否已经分配成功</li>
</ul>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Pod</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">annotations</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">k8s.aliyun.com/pod-with-eip</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">containers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> example</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> busybox</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token number" style="color:rgb(247, 140, 108)">1.28</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">'sh'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'-c'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'echo The app is running! &amp;&amp; sleep 3600'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">initContainers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> init</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> busybox</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token number" style="color:rgb(247, 140, 108)">1.28</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">'timeout'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'-t'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'60'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'sh'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'-c'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"until grep -E '^k8s.aliyun.com\\/allocated-eipAddress=\\S?[0-9]+\\S?' /etc/podinfo/annotations; do echo waiting for annotations; sleep 2; done"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">volumeMounts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> podinfo</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">mountPath</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /etc/podinfo</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> podinfo</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">downwardAPI</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">items</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"labels"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token key atrule">fieldRef</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">              </span><span class="token key atrule">fieldPath</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> metadata.labels</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"annotations"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token key atrule">fieldRef</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">              </span><span class="token key atrule">fieldPath</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> metadata.annotations</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="如何控制pod更新时eip始终只绑定了一个pod">如何控制pod更新时，EIP始终只绑定了一个pod？<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#%E5%A6%82%E4%BD%95%E6%8E%A7%E5%88%B6pod%E6%9B%B4%E6%96%B0%E6%97%B6eip%E5%A7%8B%E7%BB%88%E5%8F%AA%E7%BB%91%E5%AE%9A%E4%BA%86%E4%B8%80%E4%B8%AApod" class="hash-link" aria-label="如何控制pod更新时，EIP始终只绑定了一个pod？的直接链接" title="如何控制pod更新时，EIP始终只绑定了一个pod？的直接链接" translate="no">​</a></h4>
<p><code>pod</code>如果发生了滚动更新，且<code>pod</code>在配置有探针的情况下，可以保障始终只有一个<code>pod</code>接收流量，但是无法保证<code>EIP</code>的正常绑定，因为发布过程中有两个<code>pod</code>同时绑定了这个<code>EIP</code>，新<code>pod</code>启动后，老的<code>pod</code>下线调用了解绑<code>EIP</code>的动作，<code>EIP</code>绑定是需要调用接口到<code>vpc</code>去绑定，只有绑定了这个<code>EIP pod</code>的后续探针才会<code>ready</code>。在新<code>pod</code>滚动更新的过程中，会重新绑定<code>EIP</code>，但是旧<code>pod</code>的回收，又会卸载绑定这个<code>EIP</code></p>
<p>这里<code>EIP</code>当做了创建<code>pod</code>所需的基础资源，实际上<code>EIP</code>并不是<code>pod</code>运行所必须的，解决办法：</p>
<ul>
<li class="">
<p>A. 修改控制器实现支持在<code>pod</code>滚动更新结束后才将新的<code>pod ip</code>与<code>EIP</code>绑定（下述C可以避免此问题）</p>
</li>
<li class="">
<p>B. 将<code>pod</code>的滚动更新模式修改为销毁重建<code>Recreate</code>，这样会损失一定流量</p>
</li>
<li class="">
<p>C. 控制器支持有状态应用的pod在一定时间内发生更新后仍然使用之前的<code>EIP</code>，因此把<code>pod</code>由<code>deployment</code>改为<code>statefulset</code>，并声明<code>pod</code>在更新过程中仍然使用之前的<code>EIP</code>即可（固定<code>EIP</code>可以保证<code>Pod</code>重建后依然使用之前的<code>EIP</code>地址。该策略可与自动分配<code>EIP</code>能力结合，用于有状态应用的固定<code>EIP</code>）</p>
</li>
</ul>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">annotations</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/pod-with-eip</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/pod-eip-release-strategy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"10m"</span><br></div></code></pre></div></div>
<p>结合现状，业务<code>pod</code>如果支持多副本模式，可以切换到<code>statefulset</code>并创建<code>2</code>个副本，有状态应用的滚动更新本身就是副本销毁和重新创建，在多副本的情况下不会有流量丢失。目前只有一个（暂不支持多副本模式），且可以接受在升级的过程中丢失一定的流量，在不改变原有的无状态应用属性的情况下，选择的解决办法为B</p>
<p>最终配置如下:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> app</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">strategy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Recreate</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">annotations</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">k8s.aliyun.com/pod-eip-instanceid</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> eip</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">XXXXXXXlus72fax</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">readinessGates</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">conditionType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"k8s.aliyun.com/eip"</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="pod绑定eip后pod本身监听的端口是否也就通过eip暴露">pod绑定EIP后pod本身监听的端口是否也就通过EIP暴露？<a href="https://www.ssgeek.com/blog/ack-ji-qun-pod-du-zhan-eip-shi-jian#pod%E7%BB%91%E5%AE%9Aeip%E5%90%8Epod%E6%9C%AC%E8%BA%AB%E7%9B%91%E5%90%AC%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%AF%E5%90%A6%E4%B9%9F%E5%B0%B1%E9%80%9A%E8%BF%87eip%E6%9A%B4%E9%9C%B2" class="hash-link" aria-label="pod绑定EIP后pod本身监听的端口是否也就通过EIP暴露？的直接链接" title="pod绑定EIP后pod本身监听的端口是否也就通过EIP暴��露？的直接链接" translate="no">​</a></h4>
<p><code>pod</code>由于没有通过<code>NAT</code>请求公网，是<code>EIP</code>和<code>Pod IP</code>（ecs 弹性辅助网卡）直接绑定，因此默认情况下，通过<code>pod ip</code>（vpc内网）:端口可以直接访问到<code>pod</code>暴露的接口，通过eip（公网）:端口也可以访问到，但是由于<code>EIP</code>绑定的是<code>ecs</code>的弹性辅助网卡，因此和<code>ecs</code>共用了一个安全组，<code>ecs</code>是集群<code>node</code>，只开放了集群子网间互通，因此这个问题已经规避</p>]]></content:encoded>
            <category>云原生</category>
            <category>k8s</category>
            <category>kubernetes</category>
            <category>ack</category>
        </item>
        <item>
            <title><![CDATA[我的2022-2023]]></title>
            <link>https://www.ssgeek.com/blog/wo-de-2022-2023</link>
            <guid>https://www.ssgeek.com/blog/wo-de-2022-2023</guid>
            <pubDate>Tue, 16 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[2022-2023年度总结]]></description>
            <content:encoded><![CDATA[<p>2022-2023年度总结</p>
<p><img decoding="async" loading="lazy" alt="20240116-01" src="https://www.ssgeek.com/assets/images/20240116-01-e3e0c042dd241d555b37e4f30db6ea4f.jpg" width="4032" height="3024" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="开篇">开篇<a href="https://www.ssgeek.com/blog/wo-de-2022-2023#%E5%BC%80%E7%AF%87" class="hash-link" aria-label="开篇的直接链接" title="开篇的直接链接" translate="no">​</a></h2>
<p>“许多人迷迷糊糊，光阴虚度，尽管眼见已二三十岁，却仍旧活在生活之下，即便多活几十年，也不过是一种窘困，愁苦，凡庸的延伸，着实冤枉”</p>
<p>“复以何因缘，得大坚固力，人世间的一切都不牢靠、不坚固，寿命，也是不坚固的，顶多活一百年来年就要走了。家庭、父母、子女、夫妇相聚都不坚固，终归要分散的。佛经上经常有一句话：积聚必消散。聚拢的因缘完了，统统要分散。发了财，钞票来了，终归有不发财的一天，钱也有消散的一天。权力拿到手，总会有失掉的一天。房子建筑起来也总会有毁坏的一天。世界上有没有一个东西是坚固不破的”</p>
<p>上述是近期看到的一些文字，不再年轻的我，深有感触</p>
<p>时光如箭，岁月如梭，时间与命运的齿轮依然保持着不停转动。转眼间，两年的时光已在指尖溜走。若说时间是艺术家，那么它绘制的线条既粗犷又细腻，每一笔都描绘着成长与变迁</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="回首">回首<a href="https://www.ssgeek.com/blog/wo-de-2022-2023#%E5%9B%9E%E9%A6%96" class="hash-link" aria-label="回首的直接链接" title="回首的直接链接" translate="no">​</a></h2>
<p>2022-2023 是来北京的第4、5个年头，也是本科毕业的第3、4年。过去的两年，个人成长与所遇之事，对我而言充满了不平凡</p>
<p>还记得22年的年底，疫情在正当严重时突然放开，在此之前人们好像都已习惯了没有固定频率的核酸，习惯了健康宝与行程码。忽然间这股弦就松开了，生活也立马回到了19年疫情前的样子，伴随着的是令人“阳了”的痛苦以及生命的逝去</p>
<p>这两年完成的最大一件事情，就是人生角色的转变——我结婚了。两年里，从22年春节双方父母见面，到23年春节的订婚，再到23年国庆的婚礼，感恩父母，感恩爱人，成就了我们的小家</p>
<p>两年里拥有了几本新的证书，算是对自己这两年变化的一个证明</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="工作">工作<a href="https://www.ssgeek.com/blog/wo-de-2022-2023#%E5%B7%A5%E4%BD%9C" class="hash-link" aria-label="工作的直接链接" title="工作的直接链接" translate="no">​</a></h2>
<p>从上一篇年终总结[2021 总结与公众号文章回顾]的时间点，就到现在的公司任职，如今也已经两年过去了</p>
<p>两年中经历与推动了不少从零开始的工作内容，自身能力、经验等各方面也得到了一些历练与长进，具体内容这里就不过多展开了</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="生活">生活<a href="https://www.ssgeek.com/blog/wo-de-2022-2023#%E7%94%9F%E6%B4%BB" class="hash-link" aria-label="生活的直接链接" title="生活的直接链接" translate="no">​</a></h2>
<p>生活上认真听取了另一半的建议，不再像之前刚毕业时的宅，调整一个相对较好的自我状态。关于状态的自我剖析与调整有兴趣的朋友可以找找之前的文章。现在看来，这是一个打工人必会经历的心路历程</p>
<p>在保持健康饮食的同时，更爱在休息时间和另一半走出出租屋，打卡各店美食（实际上是薅🐑毛）</p>
<p>在22年初有了一台代步车，于是这两年每逢假期基本都会回家看看或是出去走走，享受在路上的感觉，享受出发与抵达。不到两年的时间里，总里程已经达到了约2.7w公里，期望来年伴随着四个车轮行至更多好去处</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="学习">学习<a href="https://www.ssgeek.com/blog/wo-de-2022-2023#%E5%AD%A6%E4%B9%A0" class="hash-link" aria-label="学习的直接链接" title="学习的直接链接" translate="no">​</a></h2>
<p>得益于在公司的环境和产出，这两年个人技能在前后端、架构，以及底层等方面都有了更为深入的认知与提升</p>
<p>计算机技术范围广泛且发展迅速，能够学以致用，解决实际问题，发挥与创造一些新的事物，这是技术从业者最大的价值体现，与此同时得到了正向反馈，才会更加精进</p>
<p>这些道理亦在为人处世上发挥关键作用</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="爱好">爱好<a href="https://www.ssgeek.com/blog/wo-de-2022-2023#%E7%88%B1%E5%A5%BD" class="hash-link" aria-label="爱好的直接链接" title="爱好的直接链接" translate="no">​</a></h2>
<p>公路车骑行的习惯依然保留，每年平均保持在约5000km的记录</p>
<p>在23年初购入了一台<a href="https://www.dji.com/mini-3-pro" target="_blank" rel="noopener noreferrer" class="">DJI Mini 3 Pro</a>，解锁了新的爱好，拍摄了一些对于入门选手还算可以的作品</p>
<p>感兴趣的朋友可以加微信围观朋友圈，一起交流、约骑</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="博客与公众号">博客与公众号<a href="https://www.ssgeek.com/blog/wo-de-2022-2023#%E5%8D%9A%E5%AE%A2%E4%B8%8E%E5%85%AC%E4%BC%97%E5%8F%B7" class="hash-link" aria-label="博客与公众号的直接链接" title="博客与公众号的直接链接" translate="no">​</a></h2>
<p>博客是在大学期间开始折腾，微信公众号是在21年初开通同步发文</p>
<p>有些遗憾的是这两年由于工作生物钟、个人事务、拖沓等种种原因，导致博客与公众号都停更了很久</p>
<p>当初写文的出发点更多一方面是为了不断提升自我，从输出倒逼输入，记录一些自己在技术领域的路线，究其根本，还是自己没有平衡好一天的时间，有些产出早已拟好标题与关键内容，就是迟迟没有动笔，在这里做出自我检讨</p>
<p>希望新的一年还是能继续捡起写文章的好习惯</p>
<p>另外一方面也会更多分享个人生活，或许多年后还能有人寻着互联网的记忆找到这里</p>
<p>不过这两年里，关注的公众号中，之前有很多产出的一些号主，几乎很少有在坚持写文的了。我想这不仅和自身有关，印象中之前公众号是一块很纯净的地方，现如今微信公众号的浏览页面中已经沦为广告、推广、标题党、新闻八卦无脑推文的地方</p>
<p>我曾经每天愿意花大量时间挨篇仔细品读公众号的文章，现在也只是从少量收藏了名字的号中挑选阅读，看是否有好文诞生</p>
<p>以至于我花了一定时间尝试关闭/不接受任何公众号区域推送<strong>未关注</strong>的号内容，无奈在微信“个性化广告管理”菜单中说明：“智能推荐你可能感兴趣的广告内容，你可以开启或关闭服务，或管理广告兴趣标签，但广告总数<strong>不会因此变化</strong>”</p>
<p>简单理解，就是你可以设置关闭，然并luan，对此我只能说，tx会玩，罢了</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="最后">最后<a href="https://www.ssgeek.com/blog/wo-de-2022-2023#%E6%9C%80%E5%90%8E" class="hash-link" aria-label="最后的直接链接" title="最后的直接链接" translate="no">​</a></h2>
<p>我将朋友圈签名修改为“做有趣的人，做有意思的事”，这是在毕业后对于人生的思考</p>
<p>希望大家在现今纷繁复杂的社会环境中，远离“海燕综合征”，活出自我与真实</p>
<p>同时，对各位老粉丝与朋友的支持表示真心感谢</p>
<p>新的一年继续保持，挑战更多，人生在于折腾！</p>
<p>最后，附上上述总结相关的一些视频，供日后回忆与大家品鉴</p>]]></content:encoded>
            <category>年度总结</category>
        </item>
        <item>
            <title><![CDATA[Gradle打包工具入门]]></title>
            <link>https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men</link>
            <guid>https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men</guid>
            <pubDate>Fri, 25 Mar 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[介绍Gradle打包工具入门]]></description>
            <content:encoded><![CDATA[<p>介绍Gradle打包工具入门</p>
<p><img decoding="async" loading="lazy" alt="20220325-01" src="https://www.ssgeek.com/assets/images/20220325-01-ec241bc360d1723ccd57812ff70a05d6.png" width="545" height="220" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="gradle介绍">Gradle介绍<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#gradle%E4%BB%8B%E7%BB%8D" class="hash-link" aria-label="Gradle介绍的直接链接" title="Gradle介绍的直接链接" translate="no">​</a></h2>
<p><code>Gradle</code>是一种自动化构建语言，是一种<code>DSL</code>。目前是<code>Android</code>的默认构建工具，是一个编程框架</p>
<p><code>Gradle</code>是一个基于<code>Apache Ant</code>和<code>Apache Maven</code>概念的项目自动化构建开源工具。它使用一种基于<code>Groovy</code>的特定领域语言(DSL)来声明项目设置，也增加了基于<code>Kotlin</code>语言的<code>kotlin-based DSL</code>，抛弃了基于<code>XML</code>的各种繁琐配置</p>
<p>特点：</p>
<ul>
<li class="">支持局部构建和增量构建</li>
<li class="">对多工程的构建支持很出色，工程依赖是<code>gradle</code>的第一公民</li>
<li class="">是第一个构建集成工具，与<code>ant</code>、<code>maven</code>、<code>ivy</code>有良好的相容相关性</li>
<li class=""><code>gradle</code>的整体设计是以作为一种语言为导向的，而非成为一个严格死板的框架</li>
<li class="">支持多方式依赖管理：包括从<code>maven</code>远程仓库、<code>nexus</code>私服、<code>ivy</code>仓库以及本地文件系统的<code>jars</code>或者<code>dirs</code></li>
<li class="">轻松迁移：<code>gradle</code>适用于任何结构的工程，你可以在同一个开发平台平行构建原工程和<code>gradle</code>工程。通常要求写相关测试，以保证开发的插件的相似性，这种迁移可以减少破坏性，尽可能的可靠。这也是重构的最佳实践</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="gradle��配置分析">Gradle配置分析<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#gradle%E9%85%8D%E7%BD%AE%E5%88%86%E6%9E%90" class="hash-link" aria-label="Gradle配置分析的直接链接" title="Gradle配置分析的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="根目录配置">根目录配置<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#%E6%A0%B9%E7%9B%AE%E5%BD%95%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="根目录配置的直接链接" title="根目录配置的直接链接" translate="no">​</a></h3>
<p>在代码编译时最先找到这个文件</p>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockTitle_OeMC">settings.gradle</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">apply</span><span class="token plain"> from</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'allconfig.gradle'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">include</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'app'</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 包含的工程模块</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"> buildType</span><span class="token operator" style="color:rgb(137, 221, 255)">==</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    include </span><span class="token string" style="color:rgb(195, 232, 141)">':mylibrary2'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">else</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"> buildType</span><span class="token operator" style="color:rgb(137, 221, 255)">==</span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    include </span><span class="token string" style="color:rgb(195, 232, 141)">':mylibrary'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//在这里写一个脚本，让编译速度更快</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rootProject</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">name </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'gradledemo'</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 工程名</span><br></div></code></pre></div></div>
<p>build文件</p>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockTitle_OeMC">build.gradle</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 根目录的构建脚本</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">buildscript </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 指定了仓库</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">repositories</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        maven </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 加速地址要放在最上面，从上往下找</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            url </span><span class="token string" style="color:rgb(195, 232, 141)">'http://maven.aliyun.com/nexus/content/groups/public/'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token function" style="color:rgb(130, 170, 255)">google</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token function" style="color:rgb(130, 170, 255)">jcenter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">dependencies</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 配置插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// gradle 插件版本</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        classpath </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"com.android.tools.build:gradle:4.0.1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">allprojects </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 项目本身需要的依赖，配置所有的Module公共依赖</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">repositories</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        maven </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            url </span><span class="token string" style="color:rgb(195, 232, 141)">'http://maven.aliyun.com/nexus/content/groups/public/'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token function" style="color:rgb(130, 170, 255)">google</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token function" style="color:rgb(130, 170, 255)">jcenter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 任务</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">task </span><span class="token function" style="color:rgb(130, 170, 255)">Clean</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Delete</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    delete rootProject</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">buildDir </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 清理每次编译生成的文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="应用目录配置">应用目录配置<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#%E5%BA%94%E7%94%A8%E7%9B%AE%E5%BD%95%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="应用目录配置的直接链接" title="应用目录配置的直接链接" translate="no">​</a></h3>
<p>build文件</p>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockTitle_OeMC">build.gradle</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 配置当前Module的属性</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 如果声明的是com.android.library  表示是一个依赖库</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 如果声明的是com.android.plugin   表示是一个插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 如果声明的是com.android.application   表示是一个app</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">apply</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">plugin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'com.android.application'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 类似引入包一样，引入外部的gradle配置文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">apply</span><span class="token plain"> from</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'config.gradle'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">android </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    compileSdkVersion </span><span class="token number" style="color:rgb(247, 140, 108)">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    buildToolsVersion </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"30.0.2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    defaultConfig </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        applicationId </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"com.mn.gradledemo"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        minSdkVersion </span><span class="token number" style="color:rgb(247, 140, 108)">16</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        targetSdkVersion </span><span class="token number" style="color:rgb(247, 140, 108)">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        versionCode </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        versionName </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        testInstrumentationRunner </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"androidx.test.runner.AndridJunitRunner"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">dependencies</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">implementation</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">fileTree</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">dir</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"libs"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> include</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"*.jar"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">implementation</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'androidx.appcompat:appcompat:1.2.0'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">implementation</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'androidx.constraintlayout:constraintlayout:2.0.4'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        testImplementation </span><span class="token string" style="color:rgb(195, 232, 141)">'junit:junit:4.12'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        androidtestInstrumentation </span><span class="token string" style="color:rgb(195, 232, 141)">'androidx.test.ext:junit:1.1.2'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        androidtestInstrumentation </span><span class="token string" style="color:rgb(195, 232, 141)">'androidx.test.espresso:espresso-core:3.3.0'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 只要声明了一个任务，不用调用就会执行</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">task stringText</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 使用def声明关键字</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> str1 </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"shuanyinhao"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> str2 </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'danyinhan'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token function" style="color:rgb(130, 170, 255)">println</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression">str1</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">---</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression">str2</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>配置文件</p>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockTitle_OeMC">config.gradle</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// ext就表示额外的属性声明</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">ext</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    server </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"prod"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    dataSource </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="gradle基础语法">Gradle基础语法<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#gradle%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95" class="hash-link" aria-label="Gradle基础语法的直接链接" title="Gradle基础语法的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="常规语法">常规语法<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#%E5%B8%B8%E8%A7%84%E8%AF%AD%E6%B3%95" class="hash-link" aria-label="常规语法的直接链接" title="常规语法的直接链接" translate="no">​</a></h3>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// list</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">task list</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> list</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token number" style="color:rgb(247, 140, 108)">3</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token number" style="color:rgb(247, 140, 108)">4</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token number" style="color:rgb(247, 140, 108)">6</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> weekList </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">'one'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'two'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'three'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token function" style="color:rgb(130, 170, 255)">println</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">list</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token function" style="color:rgb(130, 170, 255)">println</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">weekList</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token function" style="color:rgb(130, 170, 255)">for</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">int i in </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token operator" style="color:rgb(137, 221, 255)">..</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        println i</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 这里的it就表示每一个元素, it是一个关键字，表示它自己</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    weekList</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">each </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        println it</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// map</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">task map</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> map</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">'name'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token string" style="color:rgb(195, 232, 141)">'jack'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'age'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token number" style="color:rgb(247, 140, 108)">19</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    println map</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">'name'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    map</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">each </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        println </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"key:</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression">it</span><span class="token interpolation-string interpolation expression punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token interpolation-string interpolation expression">key</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">,value:</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression">it</span><span class="token interpolation-string interpolation expression punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token interpolation-string interpolation expression">value</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token function" style="color:rgb(130, 170, 255)">println</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token function" style="color:rgb(130, 170, 255)">methodA</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token number" style="color:rgb(247, 140, 108)">3</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 在gradle语法当中，定义一个方法</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 如果在没有return的情况下，函数默认会返回最后一行非空的值</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">methodA</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">int a</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">int b</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    a</span><span class="token operator" style="color:rgb(137, 221, 255)">+</span><span class="token plain">b</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 怎样定义一个对象</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">task javaBeanTask</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    Student student </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> new </span><span class="token class-name" style="color:rgb(255, 203, 107)">Student</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    student</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">name </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"Lily"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    student</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">age </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">19</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    println student</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">name </span><span class="token operator" style="color:rgb(137, 221, 255)">+</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"---</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression">student</span><span class="token interpolation-string interpolation expression punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token interpolation-string interpolation expression">age</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    println student</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">getName</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">+</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"---</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression">student</span><span class="token interpolation-string interpolation expression punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token interpolation-string interpolation expression function" style="color:rgb(130, 170, 255)">getAge</span><span class="token interpolation-string interpolation expression punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token interpolation-string interpolation expression punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">class </span><span class="token class-name" style="color:rgb(255, 203, 107)">Student</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    String name</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    int age</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    String </span><span class="token function" style="color:rgb(130, 170, 255)">getName</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        return name</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    void </span><span class="token function" style="color:rgb(130, 170, 255)">setName</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">String name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        this</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">name </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> name</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    int </span><span class="token function" style="color:rgb(130, 170, 255)">getAge</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        return age</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    void </span><span class="token function" style="color:rgb(130, 170, 255)">setAge</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">int age</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        this</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">age </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> age</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="闭包和it关键字">闭包和it关键字<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#%E9%97%AD%E5%8C%85%E5%92%8Cit%E5%85%B3%E9%94%AE%E5%AD%97" class="hash-link" aria-label="闭包和it关键字的直接链接" title="闭包和it关键字的直接链接" translate="no">​</a></h3>
<p><code>Groovy</code>中的闭包是一个开放，匿名的代码块，可以接受参数，返回值并赋值给变量</p>
<p>闭包，是一个代码块，或可以理解成一个匿名函数，在外部方法调用时，可以将其作为方法的实参传递给方法的形参，并在方法内部回调此匿名函数，且回调此匿名函数时可以传递实参给到匿名函数的内部去接收，并执行此匿名函数</p>
<p>同时，此代码块或匿名函数也可以赋值给一个变量，使其具有自执行的能力，且最后一行的执行语句作为匿名函数的返回</p>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 闭包，自定义闭包</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">mEach</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">closure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token function" style="color:rgb(130, 170, 255)">for</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">int i in </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token operator" style="color:rgb(137, 221, 255)">..</span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token function" style="color:rgb(130, 170, 255)">closure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">mEachWithParams</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">closure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> map </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">'name'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token string" style="color:rgb(195, 232, 141)">'groovy'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'age'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    map</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">each</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token function" style="color:rgb(130, 170, 255)">closure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">it</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">it</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 调用闭包</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">task closureTask</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 回调一个参数的时候，it就是指这个参数，就能用it，多个就不行了</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token function" style="color:rgb(130, 170, 255)">mEach</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        println it</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// a-&gt;println a</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    mEachWithParams</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        m</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">n—</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain">println </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression">m</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)"> is </span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression">n</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="环境区分">环境区分<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#%E7%8E%AF%E5%A2%83%E5%8C%BA%E5%88%86" class="hash-link" aria-label="环境区分的直接链接" title="环境区分的直接链接" translate="no">​</a></h2>
<p>主要目的是不需要修改代码就能区分测试环境和生产环境</p>
<p>例如有这样的代码目录（不同环境的配置文件）</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">app/src/main/filters/debug/config.properties</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">app/src/main/filters/release/config.properties</span><br></div></code></pre></div></div>
<p>通过读取文件流实现按不同环境区分</p>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockTitle_OeMC">build.gradle</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 配置当前Module的属性</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 如果声明的是com.android.library  表示是一个依赖库</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 如果声明的是com.android.plugin   表示是一个插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 如果声明的是com.android.application   表示是一个app</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">apply</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">plugin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'com.android.application'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 类似引入包一样，引入外部的gradle配置文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">apply</span><span class="token plain"> from</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'config.gradle'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">android </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 构建类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    buildTypes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 测试环境</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        debug</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 参数: 声明的类型、名字、属性值</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            buildConfigField </span><span class="token string" style="color:rgb(195, 232, 141)">'String'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'SERVER2'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token function" style="color:rgb(130, 170, 255)">getServer2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">'debug'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        release</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            buildConfigField </span><span class="token string" style="color:rgb(195, 232, 141)">'String'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'SERVER2'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token function" style="color:rgb(130, 170, 255)">getServer2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">'release'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 读取文件流,str代表debug还是release</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">getServer2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">String str</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> SERVER2</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    Properties properties </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> new </span><span class="token class-name" style="color:rgb(255, 203, 107)">Properties</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 相对路径</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> proFile </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">file</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"src/main/filters/"</span><span class="token operator" style="color:rgb(137, 221, 255)">+</span><span class="token plain">str</span><span class="token operator" style="color:rgb(137, 221, 255)">+</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"/config.properties"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">if</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">proFile</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">canRead</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        properties</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">load</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">new </span><span class="token class-name" style="color:rgb(255, 203, 107)">FileInputStream</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">proFile</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">if</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">properties</span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain">null</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            SERVER2 </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> properties</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">'SERVER2'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    return SERVER2</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="多渠道打包">多渠道打包<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#%E5%A4%9A%E6%B8%A0%E9%81%93%E6%89%93%E5%8C%85" class="hash-link" aria-label="多渠道打包的直接链接" title="多渠道打包的直接链接" translate="no">​</a></h2>
<p>多渠道打包常用于安卓<code>app</code>，例如统计不同渠道的数据（投放到多个应用市场）</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="核心逻辑">核心逻辑<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#%E6%A0%B8%E5%BF%83%E9%80%BB%E8%BE%91" class="hash-link" aria-label="核心逻辑的直接链接" title="核心逻辑的直接链接" translate="no">​</a></h3>
<p>主要核心实现如下</p>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">apply</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">plugin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'com.android.application'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">apply</span><span class="token plain"> from</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'config.gradle'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">android </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    compileSdkVersion </span><span class="token number" style="color:rgb(247, 140, 108)">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    buildToolsVersion </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"30.0.2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    defaultConfig </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        applicationId </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"com.mn.gradledemo"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        minSdkVersion </span><span class="token number" style="color:rgb(247, 140, 108)">16</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        targetSdkVersion </span><span class="token number" style="color:rgb(247, 140, 108)">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        versionCode </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        versionName </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        testInstrumentationRunner </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"androidx.test.runner.AndridJunitRunner"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 多渠道打包</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        flavorDimensions </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"versionCode"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 构建类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    buildTypes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 测试环境</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        debug</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 参数: 声明的类型、名字、属性值</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            buildConfigField </span><span class="token string" style="color:rgb(195, 232, 141)">'String'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'SERVER2'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token function" style="color:rgb(130, 170, 255)">getServer2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">'debug'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            android</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">applicationVariants</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">all</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                variant </span><span class="token operator" style="color:rgb(137, 221, 255)">-&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                    variant</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">outputs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">all</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                        </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> fileName </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression function" style="color:rgb(130, 170, 255)">getCurrentTime</span><span class="token interpolation-string interpolation expression punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token interpolation-string interpolation expression punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">_V{defaultConfig.versionName}_debug.apk"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                        outputFileName </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> fileName</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        release</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            buildConfigField </span><span class="token string" style="color:rgb(195, 232, 141)">'String'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'SERVER2'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token function" style="color:rgb(130, 170, 255)">getServer2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">'release'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 多渠道打包</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    productFlavors</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        xiaomi</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            buildConfigField </span><span class="token string" style="color:rgb(195, 232, 141)">'String'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'PLATE_FORM'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"\"xiaomi\""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            manifestPlaceholders </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">UMENG_CHANNEL_VALUE</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"xiaomi"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        yinyongbao</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            buildConfigField </span><span class="token string" style="color:rgb(195, 232, 141)">'String'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'PLATE_FORM'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"\"yingyongbao\""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            manifestPlaceholders </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">UMENG_CHANNEL_VALUE</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"yingyongbao"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">static </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">getCurrentTime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    return new </span><span class="token class-name" style="color:rgb(255, 203, 107)">Date</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">format</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"yyyy-MM-dd"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">timeZone</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">getTimeZone</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"UTC"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="一键化配置多渠道打包">一键化配置多渠道打包<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#%E4%B8%80%E9%94%AE%E5%8C%96%E9%85%8D%E7%BD%AE%E5%A4%9A%E6%B8%A0%E9%81%93%E6%89%93%E5%8C%85" class="hash-link" aria-label="一键化配置多渠道打包的直接链接" title="一键化配置多渠道打包的直接链接" translate="no">​</a></h3>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 一键化多渠道打包</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    productFlavors</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        xiaomi</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        yingyongbao</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    productFlavors</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">all</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        flavor </span><span class="token operator" style="color:rgb(137, 221, 255)">-&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            flavor</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">manifestPlaceholders </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">UMENG_CHANNEL_VALUE</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            buildConfigField </span><span class="token string" style="color:rgb(195, 232, 141)">'String'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:rgb(195, 232, 141)">'PLATE_FORM'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"\"</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token interpolation-string interpolation expression">name</span><span class="token interpolation-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">\""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="gradle打包加速">gradle打包加速<a href="https://www.ssgeek.com/blog/gradle-da-bao-gong-ju-ru-men#gradle%E6%89%93%E5%8C%85%E5%8A%A0%E9%80%9F" class="hash-link" aria-label="gradle打包加速的直接链接" title="gradle打包加速的直接链接" translate="no">​</a></h2>
<p>和<code>maven</code>打包一样，<code>gradle</code>会在编译时的用户家目录，例如<code>/root/.gradle</code>目录下生成一个缓存目录，除此之外，在应用的目录下也会生成一个<code>build</code>目录，这个目录下也有相应的<code>build cache</code></p>
<p>可以在全局配置<code>gradle</code>，使其拉取插件时走国内的源</p>
<p>配置文件为<code>/root/.gradle/init.gradle</code>，内容如下</p>
<div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">allprojects </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">repositories</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token function" style="color:rgb(130, 170, 255)">mavenLocal</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		maven </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> name </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"Aliyun"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> url </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"https://maven.aliyun.com/repository/public"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		maven </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> name </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"Bstek"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> url </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"http://nexus.bsdn.org/content/groups/public/"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	buildscript </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">repositories</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">			maven </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> name </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"Aliyun"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> url </span><span class="token string" style="color:rgb(195, 232, 141)">'https://maven.aliyun.com/repository/public'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">			maven </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> name </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"Bstek"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> url </span><span class="token string" style="color:rgb(195, 232, 141)">'http://nexus.bsdn.org/content/groups/public/'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">			maven </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> name </span><span class="token interpolation-string string" style="color:rgb(195, 232, 141)">"M2"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> url </span><span class="token string" style="color:rgb(195, 232, 141)">'https://plugins.gradle.org/m2/'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>CICD</category>
            <category>DevOps</category>
            <category>Gradle</category>
        </item>
        <item>
            <title><![CDATA[基于阿里云RAM+ACK托管版集群的RBAC授权]]></title>
            <link>https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan</link>
            <guid>https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan</guid>
            <pubDate>Wed, 23 Feb 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[介绍基于阿里云RAM+ACK托管版集群的RBAC授权]]></description>
            <content:encoded><![CDATA[<p>介绍基于阿里云RAM+ACK托管版集群的RBAC授权</p>
<p><img decoding="async" loading="lazy" alt="20220223-01" src="https://www.ssgeek.com/assets/images/20220223-01-abdd4908f77897ea1c85fd038b741e9d.png" width="1686" height="732" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="背景">背景<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="背景的直接链接" title="背景的直接链接" translate="no">​</a></h2>
<p>使用阿里云<code>ack</code>托管版运行<code>k8s</code>集群，有时需要对团队内成员授权集群非管理员的权限，以及某些服务需要调用<code>k8s</code>相关<code>api</code>做特定操作，例如在指定的某<code>namespace</code>下创建某控制器（例如<code>deployment</code>）的权限</p>
<p>由于在<code>ack</code>托管版环境下，集群的<code>master</code>节点由阿里云托管，对租户不可见，因此除了基于<code>k8s</code>的<code>RBAC</code>权限外，还需要授予阿里云的授权体系，即<code>RAM</code></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="授权体系概述">授权体系概述<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#%E6%8E%88%E6%9D%83%E4%BD%93%E7%B3%BB%E6%A6%82%E8%BF%B0" class="hash-link" aria-label="授权体系概述的直接链接" title="授权体系概述的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="k8s授权体系">k8s授权体系<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#k8s%E6%8E%88%E6%9D%83%E4%BD%93%E7%B3%BB" class="hash-link" aria-label="k8s授权体系的直接链接" title="k8s授权体系的直接链接" translate="no">​</a></h3>
<p>先来回忆一下<code>k8s</code>的<code>RBAC</code>（Role-Based Access Control）基于角色的访问控制授权体系</p>
<p>这是一种很常见并通用的授权体系，在<code>k8s</code>中，<code>RBAC</code>使用<code>rbac.authorization.k8s.io</code> API Group 来实现授权决策</p>
<p><code>Kubernetes</code>从<code>1.6</code>版本开始支持<code>RBAC</code>，集群管理员可以对用户或服务账号的角色进行更精确的资源访问控制。允许管理员通过<code>Kubernetes API</code>动态配置策略，在<code>RBAC</code>中，权限与角色相关联，用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中，角色是为了完成各种工作而创造，用户则依据它的责任和资格来被指派相应的角色，用户可以很容易地从一个角色被指派到另一个角色</p>
<p><img decoding="async" loading="lazy" alt="20220223-02" src="https://www.ssgeek.com/assets/images/20220223-02-fa9d8ad002d4b83f7f39766ea0d6e613.png" width="624" height="271" class="img_ev3q"></p>
<p>如上图所示，左边对于<code>Pod</code>资源的<code>get</code>、<code>list</code>操作（称为请求动词）类似于常见的<code>CRUD</code>，对<code>k8s</code>的相关资源操作都是以<code>REST API</code>形式发起，每一类请求动词对应<code>http</code>请求如下表</p>
<table><thead><tr><th>HTTP 动词</th><th>请求动词</th></tr></thead><tbody><tr><td>POST</td><td>create</td></tr><tr><td>GET, HEAD</td><td>get （针对单个资源）、list（针对集合）</td></tr><tr><td>PUT</td><td>update</td></tr><tr><td>PATCH</td><td>patch</td></tr><tr><td>DELETE</td><td>delete（针对单个资源）、deletecollection（针对集合）</td></tr></tbody></table>
<p><code>k8s</code>中的资源和<code>API Group</code>关联，不同的资源属于不同的<code>API Group</code>，例如<code>Pod</code>属于<code>Core API Group</code>，<code>Deployements</code>属于<code>apps API Group</code></p>
<p>资源操作的集合叫做<code>Rule</code>，<code>RBAC</code>中的角色，在k8s中分为<code>Role</code>和<code>ClusterRole</code>，其区别就是前者是命名空间级别下，后者不限命名空间（集群范围内生效）</p>
<p>上图最右边即用户，<code>k8s</code>中的<code>用户</code>可以分为三类：User、Group、Service Account，<code>User</code>即传统意义上的用户，这个用户一般由外部服务管理；<code>Group</code>用来关联多个账户；而<code>Service Account</code>（服务帐号）就是通过<code>Kubernetes API</code>来管理的一些用户帐号，适用于集群内部运行的应用程序。所有的用户称作一个<code>Subject</code></p>
<p>有了角色和用户，就需要两者之间的绑定关系，由于角色有<code>Role</code>和<code>ClusterRole</code>两类，因此绑定关系也分为<code>RoleBinding</code>和<code>ClusterRoleBinding</code>，即把声明的<code>Subject</code>和想要绑定的<code>Role</code>进行绑定（给某个用户绑定上某些操作的权限），二者作用范围和角色类似</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="阿里云ram遇上rbac">阿里云RAM遇上RBAC<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#%E9%98%BF%E9%87%8C%E4%BA%91ram%E9%81%87%E4%B8%8Arbac" class="hash-link" aria-label="阿里云RAM遇上RBAC的直接链接" title="阿里云RAM遇上RBAC的直接链接" translate="no">​</a></h3>
<p>如文章封面图所示，<code>ACK</code>的授权体系包含对基础资源层的<code>RAM</code>授权和对<code>ACK</code>集群层的<code>RBAC</code>授权两部分</p>
<ul>
<li class=""><code>RAM</code>授权对应<code>ACK</code>集群的运维操作，需要获取<code>ACK</code>产品及其所依赖阿里云云产品的<code>OpenAPI</code>操作权限，主要包括以下操作：<!-- -->
<ul>
<li class="">集群：创建、查看、升级、删除</li>
<li class="">节点池：创建、修改、扩缩容</li>
<li class="">授权管理</li>
<li class="">集群监控、日志、事件</li>
</ul>
</li>
<li class=""><code>RBAC</code>授权对应的是运行于<code>ACK</code>集群中<code>Kubernetes</code>应用的运维操作，需要获取ACK集群及其命名空间的操作权限，主要包括对以下<code>Kubernetes</code>对象的增删改查操作：<!-- -->
<ul>
<li class="">工作负载：Deployment、StatefulSet、DaemonSet、Job、CronJob、Pod、ReplicaSet、HPA等</li>
<li class="">网络：Service、Ingress、NetworkPolicy等</li>
<li class="">存储：PV、PVC、StorageClass等</li>
<li class="">Namespace、ConfigMap 、Secrets等</li>
</ul>
</li>
</ul>
<p>因此当<code>RAM</code>用户或<code>RAM</code>角色需要进行集群运维和应用运维时，需要依次对其进行<code>RAM</code>授权和<code>RBAC</code>授权</p>
<p>对于<code>RAM</code>这里不再深入，因为阿里云<code>RAM</code>关联了很多很多不同的云产品统一进行授权，因此很复杂，也不做过多研究</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="授权过程">授权过程<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#%E6%8E%88%E6%9D%83%E8%BF%87%E7%A8%8B" class="hash-link" aria-label="授权过程的直接链接" title="授权过程的直接链接" translate="no">​</a></h2>
<p>上面对阿里云<code>RAM</code>和<code>k8s</code>的<code>RBAC</code>两个体系做了简要介绍和回顾，接下来根据一个实际场景简要介绍授权的整个过程以及需要注意的踩坑点</p>
<p>需求如下：</p>
<p>研发或集群外服务需要操作某集群，例如<code>dev</code>（开发）<code>ack</code>集群，具有<code>dev</code>命名空间的创建、删除<code>deployment</code>、<code>service</code>、<code>ingress</code>这三类资源的权限</p>
<p>若服务在集群内，那么就可以通过<code>ServiceAccount</code>方式，假设服务在集群外，目的是要生成一个给<code>kubectl</code>使用的<code>config</code>文件</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="创建ram用户并授权">创建RAM用户并授权<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#%E5%88%9B%E5%BB%BAram%E7%94%A8%E6%88%B7%E5%B9%B6%E6%8E%88%E6%9D%83" class="hash-link" aria-label="创建RAM用户并授权的直接链接" title="创建RAM用户并授权的直接链接" translate="no">​</a></h3>
<p>由于用户最终只能通过控制台才能获取<code>config</code>文件，因此需要创建一个可以登录控制台，并对<code>ack</code>具有只读权限的用户</p>
<p><img decoding="async" loading="lazy" alt="20220223-03" src="https://www.ssgeek.com/assets/images/20220223-03-6686048d6fe979e70115f12f19ab437b.png" width="768" height="694" class="img_ev3q"></p>
<p>然后对用户进行授权，记录下用户的密码</p>
<p><img decoding="async" loading="lazy" alt="20220223-04" src="https://www.ssgeek.com/assets/images/20220223-04-aeac9d7724fcd3e1038caedf216914f5.png" width="822" height="716" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ack集群中创建clusterrole">ACK集群中创建ClusterRole<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#ack%E9%9B%86%E7%BE%A4%E4%B8%AD%E5%88%9B%E5%BB%BAclusterrole" class="hash-link" aria-label="ACK集群中创建ClusterRole的直接链接" title="ACK集群中创建ClusterRole的直接链接" translate="no">​</a></h3>
<p>在集群中创建相关授权通常是通过编写对应的<code>yaml</code>资源清单</p>
<p>这里推荐一个图形化的工具<code>Permission manager</code>，是一个简单便捷的<code>RBAC</code>管理界面工具，支持通过<code>web</code>界面创建用户，分配<code>Namespace</code>权限，并可以生成<code>kubeconfig</code>文件，项目地址<a href="https://github.com/sighupio/permission-manager" target="_blank" rel="noopener noreferrer" class="">https://github.com/sighupio/permission-manager</a></p>
<p>前面需求提到是指定命名空间下的权限，但这里是创建<code>ClusterRole</code>而不是<code>Role</code>，这个问题后面解释</p>
<p><code>ClusterRole</code>的内容如下</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ClusterRole</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> rbac.authorization.k8s.io/v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> project</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">rbac</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">role</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">rules</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">apiGroups</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"extensions"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"apps"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">resources</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"deployments"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"create"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"delete"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">apiGroups</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">resources</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"service"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"create"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"delete"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">apiGroups</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"networking.k8s.io"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">resources</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"ingress"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">verbs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"create"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"delete"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>使用<code>kubectl</code>进行创建</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">➜  rbac git:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">master</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> ✗ kubectl apply </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-f</span><span class="token plain"> clusterrole.yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="控制台授权绑定">控制台授权绑定<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#%E6%8E%A7%E5%88%B6%E5%8F%B0%E6%8E%88%E6%9D%83%E7%BB%91%E5%AE%9A" class="hash-link" aria-label="控制台授权绑定的直接链接" title="控制台授权绑定的直接链接" translate="no">​</a></h3>
<p>在<code>ack</code>的控制台对<code>ram</code>用户授权，点击到某个集群——&gt;安全管理——&gt;授权，选择上面创建的<code>ram</code>子账号，点击“管理权限”，选择集群（这里虽然已经进入到了特定集群，但依然可以选择其他集群，或许是<code>ack</code>产品设计上有点不合理），选择对应要授权的命名空间，访问权限选择“自定义”，然后下拉就能找到上面创建的名为<code>project-rbac-role</code>的<code>ClusterRole</code></p>
<p>上面提到了创建<code>ClusterRole</code>而不是<code>Role</code>，原因就在这里，因为这里下拉只能读取到集群中存在的<code>ClusterRole</code>，选择完成后点击下一步，授权成功</p>
<p><img decoding="async" loading="lazy" alt="20220223-05" src="https://www.ssgeek.com/assets/images/20220223-05-6efe2f2282ddb1642e72aa0d0c20ba01.png" width="2888" height="2000" class="img_ev3q"></p>
<p>那么，既然已经使用了<code>ClusterRole</code>，又选定了命名空间，因此相当于还是基于<code>Role</code>的权限？</p>
<p>没错，实际上这里的操作是对应的在<code>ack</code>集群中创建了一个<code>Rolebinding</code>绑定集群的<code>ClusterRole</code>，正常来说应该是<code>Rolebinding</code>绑定集群的<code>Role</code>，<code>ClusterRolebinding</code>绑定集群的<code>ClusterRole</code>，这里相当于交叉绑定了，但实际上这个<code>ClusterRole</code>的权限范围缩小了</p>
<p>可以通过如下方式查看集群中的<code>Rolebinding</code>，名称大致为“ram用户的uid-命名空间-clusterrole的名称-rolebinding”，关联的<code>subjects</code>用户正是<code>ram</code>用户的<code>uid</code></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">➜  rbac git:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">master</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> ✗ kubectl get rolebinding </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-n</span><span class="token plain"> dev</span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token function" style="color:rgb(130, 170, 255)">grep</span><span class="token plain"> 29xxxxxxxxxxx1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">29xxxxxxxxxxx1-dev-project-rbac-role-rolebinding   ClusterRole/project-rbac-role    41m</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">➜  rbac git:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">master</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> ✗ kubectl </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-n</span><span class="token plain"> dev get rolebinding 29xxxxxxxxxxx1-dev-project-rbac-role-rolebinding </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-o</span><span class="token plain"> yaml</span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain">kubectl neat</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">apiVersion: rbac.authorization.k8s.io/v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kind: RoleBinding</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">metadata:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  name: 29xxxxxxxxxxx1-dev-project-rbac-role-rolebinding</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  namespace: dev</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">roleRef:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  apiGroup: rbac.authorization.k8s.io</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kind: ClusterRole</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  name: project-rbac-role</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">subjects:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">- apiGroup: rbac.authorization.k8s.io</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  kind: User</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  name: </span><span class="token string" style="color:rgb(195, 232, 141)">"29xxxxxxxxxxx1"</span><br></div></code></pre></div></div>
<p>到这里授权就完成了</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="获取连接集群的config">获取连接集群的config<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#%E8%8E%B7%E5%8F%96%E8%BF%9E%E6%8E%A5%E9%9B%86%E7%BE%A4%E7%9A%84config" class="hash-link" aria-label="获取连接集群的config的直接链接" title="获取连接集群的config的直接链接" translate="no">​</a></h3>
<p>用上面创建的<code>readonly</code>这个<code>ram</code>用户登录到<code>ack</code>的每个集群控制台，获取这个<code>ram</code>用户的集群连接信息即<code>config</code>内容，保存成文件即可</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="小结">小结<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#%E5%B0%8F%E7%BB%93" class="hash-link" aria-label="小结的直接链接" title="小结的直接链接" translate="no">​</a></h2>
<p>使用<code>ack</code>托管版对集群授权需要关联<code>ram</code>用户和集群<code>RBAC</code>的<code>ClusterRole</code>，无需在集群中手动创建其他资源，整个过程中有一定的小坑和个人感觉设计不太合理的地方仅供参考~</p>
<p>See you ~</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="参考资料">参考资料<a href="https://www.ssgeek.com/blog/ji-yu-a-li-yun-ramack-tuo-guan-ban-ji-qun-de-rbac-shou-quan#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99" class="hash-link" aria-label="参考资料的直接链接" title="参考资料的直接链接" translate="no">​</a></h3>
<p><a href="https://kubernetes.io/zh/docs/reference/access-authn-authz/authorization/" target="_blank" rel="noopener noreferrer" class="">https://kubernetes.io/zh/docs/reference/access-authn-authz/authorization/</a></p>
<p><a href="https://help.aliyun.com/document_detail/119596.html" target="_blank" rel="noopener noreferrer" class="">https://help.aliyun.com/document_detail/119596.html</a></p>]]></content:encoded>
            <category>云原生</category>
            <category>k8s</category>
            <category>kubernetes</category>
            <category>ack</category>
        </item>
        <item>
            <title><![CDATA[服务网格和Istio初识-续]]></title>
            <link>https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/</link>
            <guid>https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/</guid>
            <pubDate>Thu, 20 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[本文是服务网格和Istio初识的续篇内容，主要是漫谈(记录)一些关于服务网格、Istio的一些理论及个人认知]]></description>
            <content:encoded><![CDATA[<p>本文是<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi/" target="_blank" rel="noopener noreferrer" class="">服务网格和Istio初识</a>的续篇内容，主要是漫谈(记录)一些关于服务网格、<code>Istio</code>的一些理论及个人认知</p>
<blockquote>
<p>为什么还要写这类看似枯燥的文章？我始终认为，学习和实践应用一门新技术之前，应该做好多方调研，全局认知，当前有什么痛点能解决而不是有哪些功能能拿来用等等，到最后不至于仅仅是用了起来而已</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="服务治理的三种形态">服务治理的三种形态<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86%E7%9A%84%E4%B8%89%E7%A7%8D%E5%BD%A2%E6%80%81" class="hash-link" aria-label="服务治理的三种形态的直接链接" title="服务治理的三种形态的直接链接" translate="no">​</a></h2>
<p>服务治理的发展经过了以下三种形态的演进</p>
<ul>
<li class="">应用程序中包含治理逻辑（代码自行实现，复用性很低）</li>
<li class="">治理逻辑独立的代码（<code>sdk</code>方式，提高复用性，但避免不了的是要应用一起打包部署）</li>
<li class="">治理逻辑独立的进程（<code>sidecar</code>模式，对应用无感知，解耦合）</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="服务网格的特点">服务网格的特点<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC%E7%9A%84%E7%89%B9%E7%82%B9" class="hash-link" aria-label="服务网格的特点的直接链接" title="服务网格的特点的直接链接" translate="no">​</a></h2>
<ul>
<li class="">基础设施：服务网格是一种处理服务间通信的基础设施层</li>
<li class="">云原生：服务网格尤其适用于在云原生场景下帮助应用程序在复杂的服务拓扑间可靠地传递请求</li>
<li class="">网络代理：在实际使用中，服务网格一般是通过一组轻量级网络代理来执行治理逻辑的</li>
<li class="">对应用透明：轻量网络代理与应用程序部署在一起，但应用感知不到代理的存在，还是使用原来的方式工作</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="网格带来的损耗">网格带来的损耗<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#%E7%BD%91%E6%A0%BC%E5%B8%A6%E6%9D%A5%E7%9A%84%E6%8D%9F%E8%80%97" class="hash-link" aria-label="网格带来的损耗的直接链接" title="网格带来的损耗的直接链接" translate="no">​</a></h2>
<p>传统环境下，服务<code>A</code>到服务<code>B</code>可以直接通过网络（<code>ip</code>或服务名）直连</p>
<p>用了网格后，从<code>A</code>服务到<code>B</code>服务的一个访问必须要经过<code>A</code>服务的<code>Sidecar</code>拦截<code>Outbound</code>流量执行治理动作；再经过<code>B</code>服务的<code>Sidecar</code>拦截<code>Inbound</code>流量，执行治理动作。 这就引入两个问题：</p>
<ul>
<li class="">增加了两处延迟和可能的故障点</li>
<li class="">多出来的这两跳对于访问性能、整体可靠性及整个系统的复杂度都带来了新的挑战</li>
</ul>
<p>通过保证转发代理的轻量和高性能降低时延影响，尤其是考虑到后端实际使用的应用程序一般比代理更重，叠加代理并不会明显影响应用的访问性能；另外，对于这些高性能的代理，只要消耗足够的资源总能达到期望的性能， 特别是云原生场景下服务的弹性特点使得服务实例的弹性扩展变得非常方便，通过扩展实例数量总是能得到期望的访问性能</p>
<p>因此最终需要决策的是：
是否愿意花费额外的少量资源在这些基础设施上来换取开发、运维的灵活性、业务的非侵入性和扩展性等便利？</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="为什么服务网格选择istio">为什么服务网格选择Istio<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC%E9%80%89%E6%8B%A9istio" class="hash-link" aria-label="为什么服务网格选择Istio的直接链接" title="为什么服务网格选择Istio的直接链接" translate="no">​</a></h2>
<ul>
<li class="">控制面设计</li>
</ul>
<p><code>Istio</code>作为一种全新的设计，在功能、形态、架构和扩展性上提供了远超服务网格的能力范围。它基于<code>xDS</code>协议提供了一套标准的控制面规范，向数据面传递服务信息和治理规则。<code>Istio</code>的早期版本使用<code>Envoy V1</code>版本的<code>API</code>，即<code>Restful</code>方式，其新版本使用<code>Envoy V2</code>版本的<code>API</code>，即<code>gRPC</code>协议。标准的控制面<code>API</code>解耦了控制面和数据面的绑定。<code>Nginx</code>的<code>nginMesh</code>、<code>F5 Networks</code>的<code>Aspen Mesh</code>等多种数据面代理支持<code>Istio</code>的控制面，甚至有些老牌微服务<code>SDK</code>也开始往<code>Istio</code>上集成</p>
<ul>
<li class="">数据面设计</li>
</ul>
<p><code>Istio</code>的标准数据面<code>Envoy</code>是由<code>Lyft</code>内部于<code>2016</code>年开发的，比<code>Linkerd</code>更早。<code>2016</code>年<code>9</code>月，<code>Envoy</code>开源并发布了<code>1.0.0</code>版本；<code>2017</code>年<code>9</code>月，<code>Envoy</code>加入<code>CNCF</code>，成为第<code>2</code>个<code>Service Mesh</code>项目；<code>2018</code>年<code>11</code>月，<code>Envoy</code>从<code>CNCF</code>毕业，这标志着其趋于成熟。从开发语言上看，<code>Envoy</code>是使用<code>C++</code>开发的，其性能和资源占用比用<code>Rust</code>开发的<code>Linkerd Proxy</code>要更好，更能满足服务网格中对透明代理的轻量高性能要求；从能力上看，<code>Envoy</code>提供<code>L3/L4</code>过滤器、<code>HTTP L7</code>过滤器，支持<code>HTTP/2</code>、<code>HTTP L7</code>路由及<code>gRPC</code>、<code>MongoDB</code>、<code>DynamoDB</code>等协议，有服务发现、健康检查、高级<code>LB</code>、前端代理等能力，具有极好的 可观察性、动态配置功能；从架构实现上看，<code>Envoy</code>是一个可高度定制化的程序，通过<code>Filter</code>机制提供了 高度扩展性，还支持热重启，其代码基于模块化编码，易于测试。除了在<code>Istio</code>中应用，<code>Envoy</code>在其他<code>Service Mesh</code>框架中也被广泛应用，渐渐成为<code>Service Mesh</code>的数据平面标准</p>
<ul>
<li class="">大厂加持</li>
</ul>
<p><code>Istio</code>由谷歌和<code>IBM</code>共同推出，从应用场景的分析规划到本身的定位，从自身架构的设计到与周边生态的结合，都有着比较严密的论证。<code>Istio</code>项目在发起时已经确认了将云原生生态系统中的容器作为核心打包和运行时，将<code>Kubernetes</code>作为管理容器的编排系统，需要一个系统管理在容器 平台上运行的服务之间的交互，包括控制访问、安全、运行数据收集等，而<code>Istio</code>正是为此而生的；另外，<code>Istio</code>成为架构的默认部分，就像容器和<code>Kubernetes</code>已经成为云原生架构的默认部分一样</p>
<p>另外一点，很多的公有云厂商在提供<code>kubernetes</code>容器服务时也内置了<code>Istio</code>功能或者二次开发（包装）了<code>Istio</code>，例如阿里云的<code>asm</code></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="istio与kubernetes">Istio与kubernetes<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#istio%E4%B8%8Ekubernetes" class="hash-link" aria-label="Istio与kubernetes的直接链接" title="Istio与kubernetes的直接链接" translate="no">​</a></h2>
<p><code>Istio</code>和<code>Kubernetes</code>从设计理念、使用体验、系统架构甚至代码风格等小细节来看，关系都非常紧密。更细粒度的proxy提供更多更细粒度的能力</p>
<p><img decoding="async" loading="lazy" alt="20220120-01" src="https://www.ssgeek.com/assets/images/20220120-01-b784f77e077a0513987fda3e208ec02a.png" width="1160" height="896" class="img_ev3q"><code>Istio</code>最大化地利用了<code>Kubernetes</code>这个基础设施，与之叠加在一起形成了一个更强大的用于进行服务运行和治理的基础设施，并提供了更透明的用户体验。</p>
<ul>
<li class="">数据面</li>
</ul>
<p>数据面<code>Sidecar</code>运行在<code>Kubernetes</code>的<code>Pod</code>里，作为一个<code>Proxy</code>和业务容器部署在一起。在服务网格的定义中要求应用程序在运行的时候感知不到<code>Sidecar</code>的存在。而基于<code>Kubernetes</code>的一个<code>Pod</code>多个容器的优秀设计使得部署运维对用户透明，用户甚至感知不到部署<code>Sidecar</code>的过程。用户还是用原有的方式创建负载，通过<code>Istio</code>的自动注入服务，可以自动给指定的负载注入<code>Proxy</code>。如果在另一种环境下部署和使用<code>Proxy</code>，则不会有这样的便利</p>
<ul>
<li class="">统一服务发现</li>
</ul>
<p><code>Istio</code>的服务发现机制非常完美地基于<code>Kubernetes</code>的域名访问机制构建而成，省去了再搭一个类似<code>Eureka</code>的注册中心的麻烦，更避免了在<code>Kubernetes</code>上运行时服务发现数据不一致的问题</p>
<p>尽管<code>Istio</code>强调自己的可扩展性的重要性在于适配各种不同的平台，也可以对接其他服务发现机制，但在实际场景下，通过深入分析<code>Istio</code>几个版本的代码和设计，便可以发现其重要的能力都是基于<code>Kubernetes</code>进行构建的</p>
<ul>
<li class="">基于<code>Kubernetes CRD</code>描述规则</li>
</ul>
<p><code>Istio</code>的所有路由规则和控制策略都是通过<code>Kubernetes CRD</code>实现的，因此各种规则策略对应的数据也被存储在<code>kube-apiserver</code>中，不需要另外一个单独的<code>APIServer</code>和后端的配置管理。所以，可以说<code>Istio</code>的<code>APIServer</code>就是<code>Kubernetes</code>的<code>APIServer</code>，数据也自然地被存在了对应<code>Kubernetes</code>的<code>etcd</code>中</p>
<p><code>Istio</code>非常巧妙地应用了<code>Kubernetes</code>这个好基座，基于<code>Kubernetes</code>的已有能力来构建自身功能。<code>Kubernetes</code>里已经有的，绝不再自己搞一套，避免了数据不一致和用户使用体验的问题</p>
<p><code>Istio</code>不仅数据面<code>Envoy</code>跑在<code>Kubernetes</code>的<code>Pod</code>里，其控制面也运行在<code>Kubernetes</code>集群中，其控制面组件本身存在的形式也是<code>Kubernetes Deployment</code>和<code>Service</code>，基于<code>Kubernetes</code>扩展和构建</p>
<p><img decoding="async" loading="lazy" alt="20220120-02" src="https://www.ssgeek.com/assets/images/20220120-02-35c8d8b5b9ba12bfc4a8d0908af82475.png" width="1344" height="876" class="img_ev3q"></p>
<p>最后，看看微服务、容器、<code>Kubernetes</code>、<code>Istio</code>四者的关系</p>
<p><img decoding="async" loading="lazy" alt="20220120-03" src="https://www.ssgeek.com/assets/images/20220120-03-a8d5b7fd7cac56496e10a653b9444f8f.png" width="1499" height="764" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="微服务和istio的选择侧重">微服务和Istio的选择侧重<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%92%8Cistio%E7%9A%84%E9%80%89%E6%8B%A9%E4%BE%A7%E9%87%8D" class="hash-link" aria-label="微服务和Istio的选择侧重的直接链接" title="微服务和Istio的选择侧重的直接链接" translate="no">​</a></h2>
<p>微服务是架构风格、方法论，<code>Istio</code>是一套完整的实践</p>
<p>但是，回到我在本文开头提到的一点观念，<code>Istio</code>是用来解决问题的，并不是微服务理论的一种落地，在实际项目中拿着微服务的细节列表来硬套<code>Istio</code>的功能，比如要求<code>Istio</code>治理的服务必须实现微服务的服务注册的一些细节，就明显不太适当</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="istio的侵入性">Istio的侵入性<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#istio%E7%9A%84%E4%BE%B5%E5%85%A5%E6%80%A7" class="hash-link" aria-label="Istio的侵入性的直接链接" title="Istio的侵入性的直接链接" translate="no">​</a></h2>
<p>从单个应用来看，<code>Sidecar</code>与应用进程的解耦带来的应用完全无侵入、开发语言无关等特点解除了开发语言的约束，从而极大降低了应用开发者的开发成本。这种方式也经常被称为一种应用的基础设施层，类比<code>TCP/IP</code>网络协议栈，应用程序像使用<code>TCP/IP</code>一样使用这个通用代理：<code>TCP/IP</code>负责将字节码可靠地在网络节点间传递，<code>Sidecar</code>则负责将请求可靠地在服务间进行传递。<code>TCP/IP</code>面向的是底层的数据流，<code>Sidecar</code>则可以支持多种高级协议（<code>HTTP</code>、<code>gRPC</code>、<code>HTTPS</code>等），以及对服务运行时进行高级控制，使服务变得可监控、可管理</p>
<p>从全局来看，在多个服务间有复杂的互相访问时才有服务治理的需求。即我们关注的是这些<code>Sidecar</code>组成的网格，对网格内的服务间访问进行管理，应用还是按照本来的方式进行互相访问，每个应用程序的<code>Inbound</code>流量和<code>Outbound</code>流量都要经过<code>Sidecar</code>代理，并在<code>Sidecar</code>上执行治理动作</p>
<p><code>Sidecar</code>是网格动作的执行体，全局的管理规则和网格内的元数据维护通过一个统一的控制面实现，只有数据面的<code>Sidecar</code>和控制面有联系，应用感知不到<code>Sidecar</code>，更不会和控制面有任何联系，用户的业务和控制面彻底解耦</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="istio用在哪">Istio用在哪<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#istio%E7%94%A8%E5%9C%A8%E5%93%AA" class="hash-link" aria-label="Istio用在哪的直接链接" title="Istio用在哪的直接链接" translate="no">​</a></h2>
<p><code>Istio</code>是一个服务治理平台，治理的是服务间的访问，只要有访问就可以治理，不在乎这个服务是不是 所谓的微服务，也不要求跑在其上的代码是微服务化的。单体应用即使不满足微服务的若干哲学，用<code>Istio</code>治理也是完全可以的</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="istio做了什么">Istio做了什么<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#istio%E5%81%9A%E4%BA%86%E4%BB%80%E4%B9%88" class="hash-link" aria-label="Istio做了什么的直接链接" title="Istio做了什么的直接链接" translate="no">​</a></h2>
<p>以前后端分离的服务为例
前端 服务的代码中通过域名访问 后端 服务，在两个服务中都不用包含任何服务访问管理的逻辑。<code>Istio</code>在其中都做了什么（可以做些什么）</p>
<ul>
<li class="">自动通过服务发现获取服务实例列表，并根据负载均衡策略选择一个服务实例</li>
<li class="">对服务双方启用双向认证和通道加密</li>
<li class="">如果某个服务实例连续访问出错，则可以将该实例隔离一段时间，以提高访问质量</li>
<li class="">设置最大连接数、最大请求数、访问超时等对服务进行保护</li>
<li class="">限流</li>
<li class="">对请求进行重试</li>
<li class="">修改请求中的内容</li>
<li class="">将一定特征的服务重定向</li>
<li class="">灰度发布</li>
<li class="">自动记录服务访问信息</li>
<li class="">记录调用链，进行分布式追踪</li>
<li class="">根据访问数据形成完整的应用访问拓扑</li>
<li class="">……</li>
</ul>
<p>所有这些功能，都不需要用户修改代码，用户只需在<code>Istio</code>的控制面配置即可，并且动态生效</p>
<p>对业务代码完全没有侵入性</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="用什么姿势接入-istio">用什么姿势接入 Istio<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#%E7%94%A8%E4%BB%80%E4%B9%88%E5%A7%BF%E5%8A%BF%E6%8E%A5%E5%85%A5-istio" class="hash-link" aria-label="用什么姿势接入 Istio的直接链接" title="用什么姿势接入 Istio的直接链接" translate="no">​</a></h2>
<p>虽然<code>Istio</code>能解决那么多的问题，但是引入<code>Istio</code>并不是没有代价的。最大的问题是<code>Istio</code>的复杂性，强大的功能也意味着<code>Istio</code>的概念和组件非常多，要想理解和掌握<code>Istio</code>，并成功在生产环境中部署需要非常详细的规划。一般情况下，集群管理团队需要对<code>kubernetes</code>非常熟悉，了解常用的使用模式，然后采用逐步演进的方式把<code>Istio</code>的功能分批掌控下来</p>
<ul>
<li class="">
<p>第一步，自然是在测试环境搭建一套<code>Istio</code>的集群，理解所有的核心概念和组件。了解<code>Istio</code>提供的接口和资源，知道它们的用处，思考如何应用到自己的场景中，然后是熟悉<code>Istio</code>的源代码，跟进社区的<code>issues</code>，了解目前还存在的<code>issues</code>和<code>bug</code>，思考如何规避或者修复。这一步是基础，需要积累到<code>Istio</code>安装部署、核心概念、功能和缺陷相关的知识，为后面做好准备</p>
</li>
<li class="">
<p>第二步，可以考虑接入<code>Istio</code>的观察性功能，包括<code>logging</code>、<code>tracing</code>、<code>metrics</code>数据。应用部署到集群中，选择性地（一般是流量比较小，影响范围不大的应用）为一些应用开启<code>Istio</code>自动注入功能，接管应用的流量，并安装<code>prometheus</code>和<code>zipkin</code>等监控组件，收集系统所有的监控数据。这一步可以试探性地了解 <code>Istio</code>对应用的性能影响，同时建立服务的性能测试基准，发现服务的性能瓶颈，帮助快速定位应用可能出现的问题。此时，这些功能可以是对应用开发者透明的，只需要集群管理员感知，这样可以减少可能带来的风险</p>
</li>
<li class="">
<p>第三步，为应用配置<code>timeout</code>超时参数、自动重试、熔断和降级等功能，增加服务的容错性。这样可以避免某些应用错误进行这些配置导致问题的出现，这一步完成后需要通知所有的应用开发者删除掉在应用代码中对应的处理逻辑。这一步需要开发者和集群管理员同时参与</p>
</li>
<li class="">
<p>第四步，和<code>ingress</code>、<code>helm</code>、应用上架等相关组件和流程对接，使用<code>Istio</code>接管应用的升级发布流程。让开发者可以配置应用灰度发布升级的策略，支持应用的蓝绿发布、金丝雀发布以及<code>AB</code>测试</p>
</li>
<li class="">
<p>第五步，接入安全功能。配置应用的<code>TLS</code>互信，添加<code>RBAC</code>授权，设置应用的流量限制，提升整个集群的安全性。因为安全的问题配置比较繁琐，而且优先级一般会比功能性相关的特性要低，所以这里放在了最后</p>
</li>
</ul>
<p>当然这个步骤只是一个参考，需要根据自己的情况、人力、时间和节奏来调整，找到适合的方案</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="istio不是银弹">Istio不是银弹<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi-xu/#istio%E4%B8%8D%E6%98%AF%E9%93%B6%E5%BC%B9" class="hash-link" aria-label="Istio不是银弹的直接链接" title="Istio不是银弹的直接链接" translate="no">​</a></h2>
<p><code>Istio</code>的架构在数据中心和集群管理中非常常见，每个<code>agent</code>分布在各个节点上（可以是服务器、虚拟机、pod、容器）负责接收指令并执行，以及汇报信息；控制中心负责汇聚整个集群的信息，并提供<code>API</code>让用户对集群进行管理。<code>kubernetes</code>也是类似的架构，<code>SDN（Software Defined Network）</code>也是如此。相信以后会有更多类似架构的出现，这是因为数据中心要管理的节点越来越多，我们需要把任务执行分布到各节点（<code>agent</code>负责的功能），同时也需要对整个集群进行管理和控制（<code>control plane</code>的功能），完全去中心化的架构是无法满足后面这个要求的</p>
<p><code>Istio</code>的出现为负责的微服务架构减轻了很多的负担，开发者不用关心服务调用的超时、重试、<code>rate limit</code>的实现，服务之间的安全、授权也自动得到了保证；集群管理员也能够很方便地发布应用（AB 测试和灰度发布），并且能清楚看到整个集群的运行情况</p>
<p>但是这并不表明有了<code>Istio</code>就可以高枕无忧了，<code>Istio</code>只是把原来分散在应用内部的复杂性统一抽象出来放到了统一的地方，并没有让原来的复杂消失不见。因此我们需要维护<code>Istio</code>整个集群，而<code>Istio</code>的架构比较复杂，尤其是它一般还需要架在<code>kubernetes</code>之上，这两个系统都比较复杂，而且它们的稳定性和性能会影响到整个集群。因此再采用<code>Isito</code>之前，必须做好清楚的规划，权衡它带来的好处是否远大于额外维护它的花费，需要有相关的人才对整个网络、<code>kubernetes</code>和<code>Istio</code>都比较了解才行</p>]]></content:encoded>
            <category>云原生</category>
            <category>k8s</category>
            <category>kubernetes</category>
            <category>istio</category>
            <category>服务网格</category>
        </item>
        <item>
            <title><![CDATA[服务网格和Istio初识]]></title>
            <link>https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi/</link>
            <guid>https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi/</guid>
            <pubDate>Wed, 12 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[介绍服务网格和Istio相关的生态、概念、架构等]]></description>
            <content:encoded><![CDATA[<p>介绍服务网格和Istio相关的生态、概念、架构等</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="云原生">云原生<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi/#%E4%BA%91%E5%8E%9F%E7%94%9F" class="hash-link" aria-label="云原生的直接链接" title="云原生的直接链接" translate="no">​</a></h2>
<p>云原生的定义：</p>
<ul>
<li class="">
<p>2010年，WSO2技术总监PaulFremantle 首次提出Cloud Native，他一直想用一个词表达一个架构，这种架构能够描述应用程序和中间件能够在云环境中有良好的运行状态。云原生有以下特性 分布式、弹性、多租户，子服务，按需计量和计费，增量部署和测试</p>
</li>
<li class="">
<p>2013年，Netflix云架构师，Adrian Cockcroft介绍了Netflix在AWS上基于Cloud Native的成功应用，Netflix在AWS上有上万个实例</p>
</li>
<li class="">
<p>2015年，来自Pivotal的Matt Stine，他的电子书《迁移到云原生应用架构》，他认为单体架构在向云原生架构的演进过程中，需要流程、文化、技术共同变革，该书把Cloud Native描述为一组最佳实践，具体包含如下内容：十二因子，微服务，敏捷基础设施，基于API的协作，反脆弱性</p>
</li>
<li class="">
<p>2017年，Matt Stine在接受媒体采访时又改了口风，将云原生架构归纳为模块化、可观察、可部署、可测试、可替换、可处理6特质；而Pivotal最新官网对云原生概括为4个要点：DevOps+持续交付+微服务+容器</p>
</li>
</ul>
<p>2015年云原生计算基金会（CNCF）成立，最初把云原生定义为包括：容器化封装+自动化管理+面向微服务。</p>
<ul>
<li class="">CNCF于2018年通过了对云原生重新定义的提案，V1.0的定义如下：</li>
</ul>
<p>云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中，构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API</p>
<p>这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段，云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更</p>
<p>云原生的英文原文叫<code>Cloud Native</code>，从英文的角度来理解，<code>Native</code>表示与生俱来，就是亲生的，把<code>Cloud </code>和<code>Native</code>放到一起又该如何理解？详细的解释是：应用原生被设计为在云上以最佳方式运行，充分发挥云的优势，享受云的特点</p>
<p>云原生这个词看起来比较新鲜，其实从开发人员的角度来理解是很简单的，就是应用在开发的时候就考虑到云上提供的各种服务，充分利用云的动态调度、自恢复、通过<code>API</code>访问服务等基本特性，以及敏捷高效的特性。传统的应用开发方式都是闷头开发，不管应用跑在哪个基础设施环境中，也不用考虑基础设施提供的各种能力，让应用能正常运行就好</p>
<p>上面都是从广义上来理解云原生，有点空洞，对应到具体的方法论就是大家耳熟能详的三板斧</p>
<ul>
<li class="">
<p>容器化</p>
</li>
<li class="">
<p>微服务</p>
</li>
<li class="">
<p>DevOps</p>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="20220112-01" src="https://www.ssgeek.com/assets/images/20220112-01-69838bdf54f36799c2a6eac7cc18ac8f.png" width="800" height="800" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="微服务架构">微服务架构<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi/#%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84" class="hash-link" aria-label="微服务架构的直接链接" title="微服务架构的直接链接" translate="no">​</a></h2>
<p>微服务或微服务架构是一种架构风格，它将一个应用程序构建为服务的集合。松散耦合的微服务集合提供了与单个单体应用相同的功能，但有额外的优势。微服务可以独立于其他服务进行开发和部署。它们是围绕业务能力组织的，由较小的团队拥有。它们在部署/开发中更小、更独立，可以更好地维护和测试</p>
<p>开发人员经常将云原生应用程序分解为多个执行特定动作的服务。例如，可能有一个只处理客户的服务和另一个处理订单或付款的服务。所有这些服务都通过网络相互沟通。如果一个新的付款需要被处理，请求会被发送到付款服务。如果客户数据需要更新，请求会被发送到客户服务等等</p>
<p><img decoding="async" loading="lazy" alt="20220112-02" src="https://www.ssgeek.com/assets/images/20220112-02-5c03dc890508e3e983d298cd542b4aee.png" width="880" height="551" class="img_ev3q"></p>
<p>这种类型的架构被称为微服务架构。这种架构有几个好处。可以有多个较小的团队从事个别服务。这些团队可以灵活地选择他们的技术栈和语言，并且通常有独立部署和发布服务的自主权。这种机制得以运作得益于其背后通信网络。随着服务数量的增加，它们之间的网络通信也在增加。服务和团队的数量使得监控和管理通信逻辑变得相当复杂。由于我们也知道网络是不可靠的，它们会失败，所有这些的结合使得微服务的管理和监控相当复杂</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="kubernetes">Kubernetes<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi/#kubernetes" class="hash-link" aria-label="Kubernetes的直接链接" title="Kubernetes的直接链接" translate="no">​</a></h2>
<p><code>Kubernetes</code>是现代基于容器的<code>DevOps</code>和微服务以及容器携手并进的黄金标准，其设计之初就是按照云原生的理念设计的</p>
<p><code>Kubernetes</code>是一款用于管理容器化工作负载和服务的可移植、可扩展的开源平台，拥有庞大、快速发展的生态系统，它面向基础设施，将计算、网络、存储等资源进行紧密整合，为容器提供最佳运行环 境，并面向应用提供封装好的、易用的工作负载与服务编排接口，以及运维所需的资源规格、弹性、运行参数、调度等配置管理接口，是新一代的云原生基础设施平台。 从平台架构而言，<code>Kubernetes</code>的设计围绕平台化理念，强调插件化设计与易扩展性，这是它与其他同类系统的最大区别之一，保障了对各种不同客户应用场景的普遍适应性。另外，<code>Kubernetes</code>与其他容器编排系统的显著区别是<code>Kubernetes</code>并不把无状态化、微服务化等条件作为在其上可运行的工作负载的约束</p>
<p>随着互联网的发展，后端服务和容器编排技术的日益成熟，微服务成为了后端服务的首选，<code>Kubernetes</code>也已成为目前容器编排的事实标准</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="服务网格">服务网格<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi/#%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC" class="hash-link" aria-label="服务网格的直接链接" title="服务网格的直接链接" translate="no">​</a></h2>
<p>服务网格被定义为一个专门的基础设施层，用于管理服务与服务之间的通信，使其可管理、可见、可控制。在某些版本的定义中，可能还会听到服务网格如何使服务间的通信安全和可靠。用一个更直接的句子来描述服务网格：服务网格是关于服务之间的通信</p>
<p>但是，服务网格是如何帮助通信的呢？让我们思考一下通信逻辑和它通常所在的地方。在大多数情况下，开发人员将这种逻辑作为服务的一部分来构建。通信逻辑是处理入站或出站请求的任何代码，重试逻辑，超时，甚至可能是流量路由。因此，无论何时服务<code>A</code>调用服务<code>B</code>，请求都要经过这个通信代码逻辑，这个逻辑决定如何处理这个请求</p>
<p>如果我们采用微服务的方法，最终可能会有大量的服务。我们如何处理所有这些服务的通信逻辑呢？我们可以创建一个包含这种逻辑的共享库，并在多个地方重用它。假设我们对所有的服务都使用相同的堆栈或编程语言，共享库的方法可能会很有效。如果我们不这样做，我们将不得不重新实现这个库，这会带来巨大的工作量而且效率低下。你也可能使用自己本身不拥有代码库的服务。在这种情况下，我们无法控制通信逻辑或监控</p>
<p>另外一个问题是配置。除了配置你的应用程序外，我们还必须维护通信逻辑配置。如果我们需要同时调整或更新多个服务，我们将不得不为每个服务单独进行调整</p>
<p>服务网格所做的是，它将这种通信逻辑、重试、超时等从单个服务中分离出来，并将其移到一个单独的基础设施层。在服务网格的情况下，基础设施层是一个网络代理的阵列。这些网络代理的集合（每个服务实例旁边都有一个）处理你的服务之间的所有通信逻辑。我们称这些代理为<code>sidecar</code>，因为它们与每个服务并存</p>
<p><img decoding="async" loading="lazy" alt="20220112-03" src="https://www.ssgeek.com/assets/images/20220112-03-cb6d291ace0f6f9cc8725b11239658bc.png" width="1280" height="720" class="img_ev3q"></p>
<p>我们让<code>Customer</code>服务直接与<code>Payment</code>服务通信，现在我们有一个<code>Customer</code>服务旁边的代理与<code>Payment</code>服务旁边的代理通信。服务网格控制平面以这样一种方式配置代理，即它们透明地拦截所有入站和出站请求。这些代理的集合（基础设施层）形成了一个网络网格，称为服务网格</p>
<p>将通信逻辑从业务和应用逻辑中分离出来，可以使开发人员专注于业务逻辑，而服务网格运维人员则专注于服务网格配置</p>
<p>因此，用到服务网格<code>sidecar</code>模式后，应用的拓扑可能是这样</p>
<p><img decoding="async" loading="lazy" alt="20220112-04" src="https://www.ssgeek.com/assets/images/20220112-04-d7215a3ccf3676b2dc5034a58f22d861.png" width="2199" height="1029" class="img_ev3q"></p>
<p>服务网格为我们提供了一种一致的方式来连接、保护和观察微服务。网格内的代理捕获了网格内所有通信的请求和指标。每一次失败、每一次成功的调用、重试或超时都可以被捕获、可视化，并发出警报。此外，可以根据请求属性做出决定。例如，我们可以检查入站（或出站）请求并编写规则，将所有具有特定头值的请求路由到不同的服务版本</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="istio">Istio<a href="https://www.ssgeek.com/blog/fu-wu-wang-ge-he-istio-chu-shi/#istio" class="hash-link" aria-label="Istio的直接链接" title="Istio的直接链接" translate="no">​</a></h2>
<p><code>Istio</code>是服务网格技术云原生<code>Cloud Native</code>时代的产物，是云原生应用的新型架构模式，而云原生又是云计算产业发展的新制高点</p>
<p><code>2016</code>年，<code>Google</code>决定开发一个对微服务进行管理的开源项目，它与<code>Google</code>内部使用的平台有很大的相似性，该项目被命名为<code>Istio</code>,<code>Istio</code>在希腊语中的意思是“启航”。就在<code>Google</code>启动<code>Istio</code>项目的几乎同一时间，<code>IBM</code>也发布了一个名为<code>Amalgam8</code>的开源项目，这是一个基于<code>Nginx</code>代理技术，为微服务提供基于内容路由方案的项目。随后，<code>Google</code>和<code>IBM</code>意识到这两个项目在使用场景与产品愿景上存在很大一部分交集，于是答应成为合作伙伴，<code>IBM</code>放弃<code>Amalgam8</code>的开发，与<code>Google</code>共同基于<code>Lyft</code>公司开源的<code>envoy</code>项目打造<code>Istio</code>这款产品</p>
<p><code>Istio</code>是一个与<code>Kubernetes</code>紧密结合的适用于云原生场景的<code>Service Mesh</code>形态的用于服务治理的开放平台</p>
<p><code>Istio</code>与<code>Kubernetes</code>的关系如下</p>
<p><img decoding="async" loading="lazy" alt="20220112-05" src="https://www.ssgeek.com/assets/images/20220112-05-53ecd4cdaeedd5951ac84a50e1cfe6c5.png" width="1274" height="536" class="img_ev3q"></p>
<p><code>Istio</code>的出现将服务网格的概念发扬光大，它创新性地将服务网格从逻辑上划分为“数据面板”和“控制面板</p>
<ul>
<li class="">
<p>随着分布式应用一起部署的<code>sidecar</code>成为数据平面，它能够拦截网络请求并控制服务之间的通信</p>
</li>
<li class="">
<p>而集中式的管理模块成为控制平面，它提供服务发现、流量管理、遥测数据收集以及证书轮换等功能</p>
</li>
</ul>
<p>在整个网络里面，所有的流量都在<code>sidecar</code>代理的控制当中，所有的<code>sidecar</code>代理都在控制面板控制当中，因此，可以通过控制面板控制整个服务网格，这是<code>Istio</code>带来的最大革新</p>
<p><img decoding="async" loading="lazy" alt="20220112-06" src="https://www.ssgeek.com/assets/images/20220112-06-c21c5949761420d6698f90ae738425db.png" width="1468" height="856" class="img_ev3q"></p>
<p><code>Istio</code>提供一种简单的方式来为已部署的服务建立网络，该网络具有负载均衡、服务间认证、监控等功能，只需要对服务的代码进行一点或不需要做任何改动，让服务支持<code>Istio</code>，只需要在环境中部署一个特殊的<code>sidecar</code>代理，使用<code>Istio</code>控制平面功能配置和管理代理，拦截微服务之间的所有网络通信</p>
<ul>
<li class="">
<p>HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡</p>
</li>
<li class="">
<p>通过丰富的路由规则、重试、故障转移和故障注入，可以对流量行为进行细粒度控制</p>
</li>
<li class="">
<p>可插入的策略层和配置 API，支持访问控制、速率限制和配额</p>
</li>
<li class="">
<p>对出入集群入口和出口中所有流量的自动度量指标、日志记录和追踪</p>
</li>
<li class="">
<p>通过强大的基于身份的验证和授权，在集群中实现安全的服务间通信</p>
</li>
</ul>
<p>本文就写（参考）到这里，后面围绕<code>Istio</code>做更多学习、实践的分享</p>
<p>参考</p>
<blockquote>
<ul>
<li class=""><a href="https://istio.io/latest/zh/docs/concepts/what-is-istio/" target="_blank" rel="noopener noreferrer" class="">https://istio.io/latest/zh/docs/concepts/what-is-istio/</a></li>
<li class=""><a href="https://www.infoq.cn/article/fA42rfjV*dYGAvRANFqE" target="_blank" rel="noopener noreferrer" class="">https://www.infoq.cn/article/fA42rfjV*dYGAvRANFqE</a></li>
<li class=""><a href="https://mp.weixin.qq.com/s/csY8T02Ck8bnE3vVcZxVjQ" target="_blank" rel="noopener noreferrer" class="">https://mp.weixin.qq.com/s/csY8T02Ck8bnE3vVcZxVjQ</a></li>
</ul>
</blockquote>]]></content:encoded>
            <category>云原生</category>
            <category>k8s</category>
            <category>kubernetes</category>
            <category>istio</category>
            <category>服务网格</category>
        </item>
        <item>
            <title><![CDATA[2021总结与公众号文章回顾]]></title>
            <link>https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/</link>
            <guid>https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/</guid>
            <pubDate>Sat, 01 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[2021年度总结]]></description>
            <content:encoded><![CDATA[<p>2021年度总结</p>
<p><img decoding="async" loading="lazy" alt="20220101-03" src="https://www.ssgeek.com/assets/images/20220101-03-12cc079cb294d9da8739f918b5dd2fa7.png" width="1280" height="720" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="年度总结">年度总结<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93" class="hash-link" aria-label="年度总结的直接链接" title="年度总结的直接链接" translate="no">​</a></h2>
<p>时间一转眼就到了2021年最后一天，以2021最后一个工作周的周五结束，是的2021年就这样过去了</p>
<p>2021年是来北京的第3个年头，也是本科毕业的第2年</p>
<p>在这一年年末，完成了北漂两件（大）事：换工作、换房</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="工作">工作<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#%E5%B7%A5%E4%BD%9C" class="hash-link" aria-label="工作的直接链接" title="工作的直接链接" translate="no">​</a></h3>
<p>如封面图，现在的工作地点在五道口</p>
<p>有时候我会觉得我是一个念旧的人，对于人生旅途上的人和事总会有那些美好让你难以释怀</p>
<p>因此换工作对我来说是一件艰难的事情</p>
<p>但转而一想，从初中开始，我们所处的环境、我们身边的人每过3年、4年就会换一拨</p>
<p>所以工作其实也是一样罢了，只要我们时常想起的时候总是充满美好就可以了</p>
<p>换工作对于职业发展、技术路线、公司发展等多方面也进行了多方取舍，最终选择了现在的公司</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="学习">学习<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#%E5%AD%A6%E4%B9%A0" class="hash-link" aria-label="学习的直接链接" title="学习的直接链接" translate="no">​</a></h3>
<p>这一年也在Todo中定下了不少学习计划，具体这里就不列出了</p>
<p>部分计划的成果以博客/公众号文章的形式进行了输出，公众号原创的确是一件不容易的事情，上半年坚持周更三篇，下半年就只能周更两篇了，明年再接再厉</p>
<p>当然，在计划充分饱满的前提下，应该没有人能说把年初计划完美的完成了</p>
<p>计划赶不上变化，人生总会有遗憾 ~</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="生活">生活<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#%E7%94%9F%E6%B4%BB" class="hash-link" aria-label="生活的直接链接" title="生活的直接链接" translate="no">​</a></h3>
<p>从实习来到北京，就一直住在被冠以“老破小”称号的六七十年代筒子楼</p>
<p>搬家或许对于多数人来说都是一件很艰难的事情</p>
<p>为了减少通勤时间，改善改善居住环境</p>
<p>终于在最近一个周末狠下了心，连续完成了看房、搬家</p>
<p>下面就是以后经常战斗的小窝啦 ~</p>
<p><img decoding="async" loading="lazy" alt="20220101-02" src="https://www.ssgeek.com/assets/images/20220101-02-bda50a75b10da35484fd564030e17a79.png" width="1280" height="720" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="骑行">骑行<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#%E9%AA%91%E8%A1%8C" class="hash-link" aria-label="骑行的直接链接" title="骑行的直接链接" translate="no">​</a></h3>
<p>这一年由于在前司找到了完美的停车位，感谢领导让我的小小爱好得以坚持</p>
<p>由于工作以及个人时间安排经常和俱乐部时间冲突，所以这一年去俱乐部一起参加活动的时间也就少了</p>
<p>更多骑行的时间还是在通勤以及和朋友休闲骑</p>
<p>希望新的一年到来后能继续并有所突破</p>
<p><img decoding="async" loading="lazy" alt="20220101-01" src="https://www.ssgeek.com/assets/images/20220101-01-08dfb7985fe8b8dff28b0266d723ce21.png" width="1170" height="835" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="公众号文章回顾">公众号文章回顾<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#%E5%85%AC%E4%BC%97%E5%8F%B7%E6%96%87%E7%AB%A0%E5%9B%9E%E9%A1%BE" class="hash-link" aria-label="公众号文章回顾的直接链接" title="公众号文章回顾的直接链接" translate="no">​</a></h2>
<p>这一年开始在写博客的同时发表到了公众号，除去转载的部分好文，剩下的原创文章和学习笔记按照领域分类，或按时间先后、阅读量排序整理如下，方便大家继续点击直达</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="云原生kubernetes容器相关">云原生、Kubernetes、容器相关<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#%E4%BA%91%E5%8E%9F%E7%94%9Fkubernetes%E5%AE%B9%E5%99%A8%E7%9B%B8%E5%85%B3" class="hash-link" aria-label="云原生、Kubernetes、容器相关的直接链接" title="云原生、Kubernetes、容器相关的直接链接" translate="no">​</a></h3>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485062&amp;idx=1&amp;sn=7d751b21c7b3380e1c443dde2942e9a2&amp;chksm=c14783b5f6300aa32c1822a419bfeca9f55b1b9b2efc8e7667f71bcd7e9808f391aeabe071a2#rd" target="_blank" rel="noopener noreferrer" class="">k8s生产实践之获取客户端真实IP</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247486148&amp;idx=1&amp;sn=dcf97946659a08f6e6c8d3f61c9a79c1&amp;chksm=c1478ff7f63006e18128340348cb501d5dd16978bc354b3e72d373e7386d7bddc84ebf6ccc02#rd" target="_blank" rel="noopener noreferrer" class="">基于ack k8s集群调度的方案设计</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484919&amp;idx=1&amp;sn=443693984b2dc9fe857f6f3248034e86&amp;chksm=c14780c4f63009d272151b3af19f62916e9040c9e751ce5c21f268a0b9aaf09ecdd08abab6d7#rd" target="_blank" rel="noopener noreferrer" class="">Dockerfile语法概要</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485679&amp;idx=1&amp;sn=1172cd2c386058ab365d1429af727a9e&amp;chksm=c1478ddcf63004cade1312dd70e660e3be50842387b7d36ee3c3898b90bf28f0e0a42c662bb8#rd" target="_blank" rel="noopener noreferrer" class="">k8s环境下处理容器时间问题的多种姿势</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484589&amp;idx=1&amp;sn=d0c4d6ad8860cf19d69fb71aea29f112&amp;chksm=c147819ef63008884b835f52d91af4ec64534ee8c5528ab6da7d84d52d46713ff04d0f754cae#rd" target="_blank" rel="noopener noreferrer" class="">SkyWalking链路追踪系统-部署篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484641&amp;idx=1&amp;sn=201eccd78ee681fdbe45f1c372e9abcc&amp;chksm=c14781d2f63008c4b8bb9d30cd12c1e483771ec5ccfca1d78dba3b213ffbf610973e1bd738e1#rd" target="_blank" rel="noopener noreferrer" class="">SkyWalking链路追踪系统-接入篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484682&amp;idx=1&amp;sn=df8ee7180314c1f21435e845d817ac25&amp;chksm=c1478039f630092f10dfc756aa70512d1f300199734148aa72df405527df35793e3413b83e54#rd" target="_blank" rel="noopener noreferrer" class="">SkyWalking链路追踪系统-告警篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485577&amp;idx=1&amp;sn=295216d1196b88ecae65abb1bca094e7&amp;chksm=c1478dbaf63004ac6b4a4926766545725ed0a19bb11bcc5cdcc3ee2ec727c3ac28a7050caa83#rd" target="_blank" rel="noopener noreferrer" class="">浅谈Prometheus的数据存储</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484339&amp;idx=1&amp;sn=0c2e848ea27ba9b8e98cf3f5df504deb&amp;chksm=c1478680f6300f9674b8b359db89ba4b7db161f84f3501ce849300d9a9fc6cb3ac80ffb35f1e#rd" target="_blank" rel="noopener noreferrer" class="">使用kube-prometheus部署k8s监控(最新版)</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484976&amp;idx=1&amp;sn=538491aed942ad44c1beb109afb8569f&amp;chksm=c1478303f6300a15dfb55822cae2d53d32a9043c178685d5bc222c2cc8d5f87f61699bcaed41#rd" target="_blank" rel="noopener noreferrer" class="">基于k8s集群部署Nexus与旧数据的迁移</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247486090&amp;idx=1&amp;sn=dfdaf970062f188a363c25f040f7fcfd&amp;chksm=c1478fb9f63006af4faae0df7e274419222c20c2b049abab7bc153c82dd714fb3eca95c11180#rd" target="_blank" rel="noopener noreferrer" class="">基于Dockerfile构建容器镜像的最佳实践</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484200&amp;idx=1&amp;sn=9917913be9e70d236980238574bdf2d8&amp;chksm=c147861bf6300f0dcff1e0d43e5d6d728d61267a33618f95d67fb3550af610a2753016f1f16d#rd" target="_blank" rel="noopener noreferrer" class="">两大grafana实用插件快速监控kubernetes</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485927&amp;idx=1&amp;sn=51df3b19c1eba86b0c579ae9859172c8&amp;chksm=c1478cd4f63005c233a3bfcbc2baab9693c5443fd810bbdb2afacdfb78577686b51dc9c786f1#rd" target="_blank" rel="noopener noreferrer" class="">Helm Chart语法概要 </a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247483979&amp;idx=1&amp;sn=7191ef5094026b40b8bbcbb27efa9a53&amp;chksm=c1478778f6300e6e42ad2e4a690889cf814e215c0bbe583f2e36d96767c83a2abe3174d1d70c#rd" target="_blank" rel="noopener noreferrer" class="">k8s内网和办公网络的打通实践</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484276&amp;idx=1&amp;sn=b75de92fca5fabea821f898522bb520d&amp;chksm=c1478647f6300f51b5b7353b5b805172b2b81cd2880920ed066450dc8ddfb945a2f5b83580ce#rd" target="_blank" rel="noopener noreferrer" class="">基于k8s手动部署rabbitmq集群</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247486165&amp;idx=1&amp;sn=77e3a4c387b2b8fab703f363c3b1d066&amp;chksm=c1478fe6f63006f0eee5fd9bd6eceb62ca7cfa25b3c5ff177cfdb28a55b30c62b40ef36731d8#rd" target="_blank" rel="noopener noreferrer" class="">任务执行龟速，原因竟然是......</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484680&amp;idx=1&amp;sn=059c46572a30daeae174dbbeda766cc9&amp;chksm=c147803bf630092d846cd2e568db58426676a4301c7d007b3897ab9e76fd90f3f6ae8e2d6919#rd" target="_blank" rel="noopener noreferrer" class="">在k8s中解决pod资源的正确识别</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484131&amp;idx=1&amp;sn=96c45bd0f5ff434feb686a457ee7d9f1&amp;chksm=c14787d0f6300ec61a564ef213ad044e686a0666f02f9f9a250b3ecd4bec4fdbf8549b681bc5#rd" target="_blank" rel="noopener noreferrer" class="">k8s之Ingress自动化https</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247483790&amp;idx=1&amp;sn=c397d4bf5bce3889907d2b26fd33d436&amp;chksm=c14784bdf6300dabbfc13b2917ef27b1183d5c81c75a1fbc148f163c00e0efd74b52bbfc3951#rd" target="_blank" rel="noopener noreferrer" class="">k8s Ingress nginx错误页面的深度定制</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484161&amp;idx=1&amp;sn=56e724442e5344735f817deb71779bf7&amp;chksm=c1478632f6300f24cb37c404a522706dbf9c9056229a86893502dba52856a72e22ef923aa831#rd" target="_blank" rel="noopener noreferrer" class="">基于k8s Ingress Nginx+OAuth2+Gitlab无代码侵入实现自定义服务的外部验证</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484396&amp;idx=1&amp;sn=ae3d8a38ce0f620a8b12644b7d9d0a81&amp;chksm=c14786dff6300fc9cf005e2777cc29d6f1009a4e3753741bfc61297b82cdac68c8f37c1ca035#rd" target="_blank" rel="noopener noreferrer" class="">使用flannel+canal实现k8s的NetworkPolicy</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484446&amp;idx=1&amp;sn=72a72501a4505850bbdc08fe3bca8a10&amp;chksm=c147812df630083b3b7a090ec1eebe2eeee42c219ca59325a55ee732ae9357cf62633ca17b09#rd" target="_blank" rel="noopener noreferrer" class="">kubernetes存储之GlusterFS</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247486242&amp;idx=1&amp;sn=22a7a21a3b95eb02911f17e860556b7c&amp;chksm=c1478e11f6300707e4341202f8cb1ce3ca125d321f73dcca2b94997de67007d700e916a12b9b#rd" target="_blank" rel="noopener noreferrer" class="">ack集群Terway网络场景下的vSwitch扩容</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="devopsjenkins相关">DevOps、Jenkins相关<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#devopsjenkins%E7%9B%B8%E5%85%B3" class="hash-link" aria-label="DevOps、Jenkins相关的直接链接" title="DevOps、Jenkins相关的直接链接" translate="no">​</a></h3>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484542&amp;idx=1&amp;sn=9913acdc1487af0f82b24acadc4346f6&amp;chksm=c147814df630085b19309d408c1789b6df2d200b5faa05419f5170466cef40e4a644db752d23#rd" target="_blank" rel="noopener noreferrer" class="">DevOps建设之基于钉钉OA审批流的自动化上线</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484622&amp;idx=1&amp;sn=ef9bdc890fafdd3a079a666d0cbaf96f&amp;chksm=c14781fdf63008eb48301a2d5e85d03b4040bcdcaf5baf99353f35c8d318eebf54c202e65a21#rd" target="_blank" rel="noopener noreferrer" class="">Jenkins API+Pipeline深度实践之input的自动化</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484257&amp;idx=1&amp;sn=f045a7d853788d929cde64598a0506b9&amp;chksm=c1478652f6300f4432ae9d16a0e791b9d13dfd8114b8cba9418601bfb3e0f4c513e7d266c196#rd" target="_blank" rel="noopener noreferrer" class="">JenkinsPipeline语法概要</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485525&amp;idx=1&amp;sn=6ba00bde1bbe9de20d47949298034ab1&amp;chksm=c1478d66f630047037327621c410b79fda27234818b7405186149746ef478b8e1e28abb1b92b#rd" target="_blank" rel="noopener noreferrer" class="">Jenkins连接k8s的多种姿势</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484159&amp;idx=1&amp;sn=7e77064d3ab78c29fb425a807ae00301&amp;chksm=c14787ccf6300edaea534e21bdde7b9618956f28fe70faf5857814d1b0998f759d2d9d7644a5#rd" target="_blank" rel="noopener noreferrer" class="">Jenkins workflowLibs库的使(妙)用</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247483946&amp;idx=1&amp;sn=c7ce84dcb7986bc982e06843720dde1b&amp;chksm=c1478719f6300e0fa6fbe7dec5e2f26903c28de668459fdff7a9e5cc87d504ec2fd2c459076b#rd" target="_blank" rel="noopener noreferrer" class="">Jenkins ShareLibrary实践之自定义通知器</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485043&amp;idx=1&amp;sn=06ffc7f908282566adc61997230fe6d5&amp;chksm=c1478340f6300a562a798395f247d9c449c3dd5933986aa8418edb4ffac39faf6062eaab3fea#rd" target="_blank" rel="noopener noreferrer" class="">使用Jenkins Operator在k8s中部署Jenkins</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485440&amp;idx=1&amp;sn=582d3ccf4c792673b21f6c9ee0e3ea16&amp;chksm=c1478d33f6300425ca98cc39a5635770a6b6f6f761d94214a009bcdbac3019aa3b9db26b6556#rd" target="_blank" rel="noopener noreferrer" class="">利用Github Action实现Github到Gitee的持续同步</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485893&amp;idx=1&amp;sn=4cc54576548aa36c2d7368dc1cffd7f7&amp;chksm=c1478cf6f63005e099581220d6918f21f295e42fa0e620a4d6f76b55061a214aa765ae0a4d1c#rd" target="_blank" rel="noopener noreferrer" class="">Azure DevOps的使用入门</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="python">Python<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#python" class="hash-link" aria-label="Python的直接链接" title="Python的直接链接" translate="no">​</a></h3>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484359&amp;idx=1&amp;sn=8f57dee9db3bc3c5d3689834e42344eb&amp;chksm=c14786f4f6300fe2ff8435ffa74bb6205d8dac2590ca6e8b7baa4d02aaa75200787d6eb8457c#rd" target="_blank" rel="noopener noreferrer" class="">Celery在Django中的简单应用</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484816&amp;idx=1&amp;sn=29e1079e32c1c3a087f31a89b90d701e&amp;chksm=c14780a3f63009b5d613ee7081cc9ca437a783db517d7a930e9d61c453ab60552be714c9cadf#rd" target="_blank" rel="noopener noreferrer" class="">drf的接口文档生成与管理</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484985&amp;idx=1&amp;sn=7e71be3a4557a9341592b7ed688dd8b8&amp;chksm=c147830af6300a1cb85f7b0b0ec9ff09ab35e456a99d6a8bed298c1fb3f791f454a273d3b7cb#rd" target="_blank" rel="noopener noreferrer" class="">浅谈Python鸭子类型</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484603&amp;idx=1&amp;sn=7798e00ed1ad2eb4e250605e235d910c&amp;chksm=c1478188f630089e4465712d0b21644499dd7322dbe48741a8d861bb8d05e00095575c354e65#rd" target="_blank" rel="noopener noreferrer" class="">drf分页器的使用</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485794&amp;idx=1&amp;sn=adff09a613039e0bdc187fef4c8fa7eb&amp;chksm=c1478c51f63005474e6c76a39c92bb333e1470e269a383bb57fbc1440ecb139f5c5d58256b13#rd" target="_blank" rel="noopener noreferrer" class="">基于Python实现原生的登录验证码</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484035&amp;idx=1&amp;sn=125a7afe8d651f0ecf628d0e2b487f7c&amp;chksm=c14787b0f6300ea6342a94e008a3097a1c9491ff43a446cacf1bc7e6a74639745141291c831e#rd" target="_blank" rel="noopener noreferrer" class="">Python分析Nginx日志</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485092&amp;idx=1&amp;sn=bd3644e0c7365c2305198d12be02eeb2&amp;chksm=c1478397f6300a81bc2e248524286cfcd39830be4a0315a7edf6870163b7b3d202fb0054c644#rd" target="_blank" rel="noopener noreferrer" class="">Django分页器的用法</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485105&amp;idx=1&amp;sn=0a4bb00d5fbd256fa6dab5ced3f7e781&amp;chksm=c1478382f6300a94e0a8138e0d24b93403e62fe92d29fcf23a43b299fbf58a60e84599128a04#rd" target="_blank" rel="noopener noreferrer" class="">Django自定义实现分页器</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484227&amp;idx=1&amp;sn=64d8946f2fa45d773e0290c1af1a32a4&amp;chksm=c1478670f6300f66b0afd3b7420554c2cddc57cb25eb9ebceffab93fb8193c811f13fb093e60#rd" target="_blank" rel="noopener noreferrer" class="">vue+drf+第三方滑动验证码的接入实现</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484315&amp;idx=1&amp;sn=49dd46595542a17653f3d0925cf793ef&amp;chksm=c14786a8f6300fbe1d03b155fe1e7edeafe6d9446e41326fe78873af980f73ec773d89a8b9fe#rd" target="_blank" rel="noopener noreferrer" class="">数据分析之Numpy入门</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247483903&amp;idx=1&amp;sn=e42f762df5e920813736b5dd0af64d22&amp;chksm=c14784ccf6300ddac40e93fcc2421e5165449706a6bd9e7886ccd37f4b15f178d88bac36a4b5#rd" target="_blank" rel="noopener noreferrer" class="">剖析和解决Python中网络粘包的正确姿势</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484105&amp;idx=1&amp;sn=0fb8940e5b6c67100a8598fab85cdc3f&amp;chksm=c14787faf6300eec2dda1fb346a47c28e4bae9da39301d21c4aa9f8efbd7718629ddf7bc8bb3#rd" target="_blank" rel="noopener noreferrer" class="">drf序列化器之反序列化的数据验证</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484182&amp;idx=1&amp;sn=79bfc700c56650f4ef0da06433fe31e5&amp;chksm=c1478625f6300f33186cd09631c9919c1d07b8f4094835d42849cb4c9d9a342c117cb3ace18f#rd" target="_blank" rel="noopener noreferrer" class="">Django之URL反向解析</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="golang">Golang<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#golang" class="hash-link" aria-label="Golang的直接链接" title="Golang的直接链接" translate="no">​</a></h3>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485172&amp;idx=1&amp;sn=1d22b06a23aebbbff489ba9280b41064&amp;chksm=c14783c7f6300ad1b53abb72d206cd95e05b6b7c36c75b70cdae9a1c5adbe715f3d547de9078#rd" target="_blank" rel="noopener noreferrer" class="">浅谈GoPath和Go Modules包管理</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485285&amp;idx=1&amp;sn=904482e5d4df182352679869451fdcad&amp;chksm=c1478256f6300b401d62ffded83e68aebd8d27e414d8df1b9c6b9797dc7c3fd71b39a6cb4904#rd" target="_blank" rel="noopener noreferrer" class="">Golang格式化输出</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485307&amp;idx=1&amp;sn=f3c11e71df00fd81f65a0d4de2c53ebd&amp;chksm=c1478248f6300b5ecb3de72cda3f5e0ffa7aa6c7f928b833c56cf8da62817c3fa7eaf390de2f#rd" target="_blank" rel="noopener noreferrer" class="">Golang数据类型之数组</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485336&amp;idx=1&amp;sn=0864f1872bd11bdb580ff0e6f9798372&amp;chksm=c14782abf6300bbd5e40bcbf87fe5e21d01de8c9303e54ec92147beee8039ebca02d950f2cb8#rd" target="_blank" rel="noopener noreferrer" class="">Golang数据类型之切片</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485420&amp;idx=1&amp;sn=ec2065a55399d2baefe364cd3b5ff4e1&amp;chksm=c14782dff6300bc98ef5b333f9fb405316821b9511fad249de29ce98184e19fdbaf949956f9d#rd" target="_blank" rel="noopener noreferrer" class="">浅谈float浮点型的底层存储与运算</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485456&amp;idx=1&amp;sn=1b8bbb62b04d65d647fbb96be86ca4ed&amp;chksm=c1478d23f6300435b835e834c6ce13484e2a12c2de328df17de93d06f59d6c97c4cd0da42313#rd" target="_blank" rel="noopener noreferrer" class="">Golang数据类型之Map</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485465&amp;idx=1&amp;sn=754f42d74c7322d782d7720cca5b0d89&amp;chksm=c1478d2af630043c60d200cc268916f5f091e2f9c9b2726f01117d8d803cb3dbe005661efd9e#rd" target="_blank" rel="noopener noreferrer" class="">Golang函数参数的值传递和引用传递</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485477&amp;idx=1&amp;sn=2ce6d3b5ff8200b0bf994aa62cf8212c&amp;chksm=c1478d16f63004001abfd36ef530a3f01387195e634bbb08093b58b9a8c87f51131278e4460a#rd" target="_blank" rel="noopener noreferrer" class="">Golang结构体类型的深浅拷贝</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485505&amp;idx=1&amp;sn=210cb61e6621fb569be29d968c0abced&amp;chksm=c1478d72f6300464f301aab305a5fefd35c7bb6d52b73a9846379f400d56ed9454cc68ce0ed9#rd" target="_blank" rel="noopener noreferrer" class="">Golang数据类型之指针</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485555&amp;idx=1&amp;sn=1bf1e39f053f3736833f8cf942244a76&amp;chksm=c1478d40f630045625996a9a3e1f93caf38a53d6964620e2c8fc7f2d919afac47bd9f2136fdd#rd" target="_blank" rel="noopener noreferrer" class="">Golang单元测试</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485595&amp;idx=1&amp;sn=9981e6103a6b33cc3a06be0781a2bf10&amp;chksm=c1478da8f63004be44a8c84941280f3888d4e5a2120a4288ed1a21f8a1a82fe65d719c31bae6#rd" target="_blank" rel="noopener noreferrer" class="">Golang基准测试</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485625&amp;idx=1&amp;sn=c05b5293ce7b327ddc9d8c85f957f10a&amp;chksm=c1478d8af630049c7b51a5c7cc3076f661d0059257accdbf21510439cca7e7a9fe6447d94822#rd" target="_blank" rel="noopener noreferrer" class="">Golang数据类型之结构体-上篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485652&amp;idx=1&amp;sn=9c35ae5aea09f961c57c41d908d1ad8d&amp;chksm=c1478de7f63004f15d51ea599a3847e3a7cf674a8f73d2fd4b7cd536af5b4e20297326b83bdf#rd" target="_blank" rel="noopener noreferrer" class="">Golang数据类型之结构体-下篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485722&amp;idx=1&amp;sn=55bd2a8ecce44d87273a7a50c85baad0&amp;chksm=c1478c29f630053f8c99078f8af318a81390754367b13c063e9998e76b56b875a4b2f741e4c7#rd" target="_blank" rel="noopener noreferrer" class="">Golang文件操作-上篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485736&amp;idx=1&amp;sn=4c68adc053985ba303d21c04c473fd5d&amp;chksm=c1478c1bf630050d55b3d5bc25c54b42f324f4a3529cdd26085799f63936b63be3e3201a2c10#rd" target="_blank" rel="noopener noreferrer" class="">Golang文件操作-下篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485777&amp;idx=1&amp;sn=effb4f3ee2568f240f9a68d987f51b58&amp;chksm=c1478c62f6300574ccbef49b3eece7992a2113c0be86f91de285f63d37469a4c37a9a5f96e85#rd" target="_blank" rel="noopener noreferrer" class="">Golang开发命令行工具之flag包的使用</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485814&amp;idx=1&amp;sn=54dd476d953db5b94319bdeebedc285f&amp;chksm=c1478c45f63005532d82b9d901a58e6c35340e4d7a945ac2fa8582bc7db3547fcfbf25ef0373#rd" target="_blank" rel="noopener noreferrer" class="">Golang接口类型-上篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485844&amp;idx=1&amp;sn=442b1416eece7038b473e057871321ab&amp;chksm=c1478ca7f63005b19667bf36112602919f8d0ec3cc946435df2aec36dc3f273611ea421a4546#rd" target="_blank" rel="noopener noreferrer" class="">Golang接口类型-下篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485960&amp;idx=1&amp;sn=21150114527a1513e576156fa35fa747&amp;chksm=c1478f3bf630062d346b6091cb55ef7d5c5d2f4b3b99618a0932775f139305d9311b1adc5140#rd" target="_blank" rel="noopener noreferrer" class="">Golang反射-上篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485986&amp;idx=1&amp;sn=20cdfba27e172904032a1f69987e35e3&amp;chksm=c1478f11f63006073b83265315b8205d625fe3851506f3d210be516c45c7d247d3f00c15a630#rd" target="_blank" rel="noopener noreferrer" class="">Golang反射-下篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247486194&amp;idx=1&amp;sn=4de07e00b093cacc737b9f500902cb41&amp;chksm=c1478fc1f63006d7cc80406cac0ac38f44c5858354c9cabca0c7ae987f53bf7b5f31ce43968e#rd" target="_blank" rel="noopener noreferrer" class="">Golang与散列算法</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247486226&amp;idx=1&amp;sn=e31e32bf90657414e8fbdc5dc74b9d63&amp;chksm=c1478e21f630073781bdfdc576721f6b8c8983911783d2a96b9d7e606afb95d8953e7eceba0c#rd" target="_blank" rel="noopener noreferrer" class="">Golang与对称加密</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247486250&amp;idx=1&amp;sn=bc116d95bccb12304da67b95e9d8d82d&amp;chksm=c1478e19f630070fd3531bcea0db3211d04c0082ee3ddda422f7a20dbf820cc37c84b2e57c9c#rd" target="_blank" rel="noopener noreferrer" class="">Golang与非对称加密</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="数据库相关">数据库相关<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9B%B8%E5%85%B3" class="hash-link" aria-label="数据库相关的直接链接" title="数据库相关的直接链接" translate="no">​</a></h3>
<p><a href="https://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485260&amp;idx=1&amp;sn=2f33901654d6fcc80d5ad84846fb10b2&amp;chksm=c147827ff6300b69dd8a0216e8c3b677f4dd5876a00fc3285eb7962ec2c513d2346872c70088&amp;token=1559315116&amp;lang=zh_CN#rd" target="_blank" rel="noopener noreferrer" class="">MySQL工具Atlas的安装使用</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484876&amp;idx=1&amp;sn=7969397e4439f776ee5e23c4738d9e2e&amp;chksm=c14780fff63009e900c0cd5b49f30d19ac4262c553325be9a9a26e59b77ed3a60f1e7e051f34#rd" target="_blank" rel="noopener noreferrer" class="">MySQL多实例的部署</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485213&amp;idx=1&amp;sn=c1fdfc51d28b370ea561fea77f130a1d&amp;chksm=c147822ef6300b380178f55603744029e62fe08ae33b4d37e5a9f5e52cabc53bb3a8437474f2#rd" target="_blank" rel="noopener noreferrer" class="">MySQL MHA部署与测试-上篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485236&amp;idx=1&amp;sn=cabf3539e6c51b81ccdf9c50f6040d0c&amp;chksm=c1478207f6300b115f2ab5ece5c8483c57423c797df107cb21ad4f1491a5b5f93f6ac2f02ca8#rd" target="_blank" rel="noopener noreferrer" class="">MySQL MHA部署与测试-下篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484523&amp;idx=1&amp;sn=adb4b0240bb8a38e4e5e226866619125&amp;chksm=c1478158f630084e9f94357882f5d6bc50bdbcd3c4f35d08b8acde3d791fdd02a7da551672de#rd" target="_blank" rel="noopener noreferrer" class="">MySQL备份工具之Xtrabackup</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485763&amp;idx=1&amp;sn=3e60b5319af27b5fac671e8cc736bf75&amp;chksm=c1478c70f6300566a38a098c59fe26ec7735c232ff1860467fa106aaa2a3b781dee4daebbafe#rd" target="_blank" rel="noopener noreferrer" class="">MySQL基于Binlog的数据恢复实战</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485403&amp;idx=1&amp;sn=103001d61242efa1dbd1a24a26b8a39d&amp;chksm=c14782e8f6300bfe674b8b6d1b67cc6787998af2358ef523f27487568615454f5e620cbb4fa1#rd" target="_blank" rel="noopener noreferrer" class="">数据库中间件Mycat的安装使用</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484771&amp;idx=1&amp;sn=9cbbc8b339f0938210b263cf542f7390&amp;chksm=c1478050f6300946eefd4ee42408756bfa4ee399f45965689468d266f8fe1104e12ad4efcba7#rd" target="_blank" rel="noopener noreferrer" class="">Centos7静默安装Oracle11g</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="git相关">Git相关<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#git%E7%9B%B8%E5%85%B3" class="hash-link" aria-label="Git相关的直接链接" title="Git相关的直接链接" translate="no">​</a></h3>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484891&amp;idx=1&amp;sn=4db0b1eaacc75b3708ec688ec9d23e57&amp;chksm=c14780e8f63009fedb48cbc07ea59b20d2de794675b570ce95a2a74efaae5046aef17dd2e45e#rd" target="_blank" rel="noopener noreferrer" class="">使用git-svn无损迁移SVN至GitLab</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485157&amp;idx=1&amp;sn=af94bde24f161dd1ac643612d7b82dc2&amp;chksm=c14783d6f6300ac0adb476bf0da7421b2fad58ca752fbc46a21dc129272a45a0f9b8b6076529#rd" target="_blank" rel="noopener noreferrer" class="">Git目录为什么这么大</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484050&amp;idx=1&amp;sn=ef680c7e03784ee10d003155e6e6b833&amp;chksm=c14787a1f6300eb7f959134fd16825ff1f90c29e0eb6fd3f95ef9a4627c6acbb49d1ef1f08d7#rd" target="_blank" rel="noopener noreferrer" class="">利用Git钩子实现代码发布</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="linux相关">Linux相关<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#linux%E7%9B%B8%E5%85%B3" class="hash-link" aria-label="Linux相关的直接链接" title="Linux相关的直接链接" translate="no">​</a></h3>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484474&amp;idx=1&amp;sn=1028b711dbd77cf9e49ff8b4b273c2c8&amp;chksm=c1478109f630081fd478c648e03d56821c5bd18c406fe23920384c43fb87f5bf19411b281538#rd" target="_blank" rel="noopener noreferrer" class="">Squid代理及常见的代理上网</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485077&amp;idx=1&amp;sn=6968792a0e6b2d1d8b3f02fd045c585d&amp;chksm=c14783a6f6300ab099708d9eb7a4ebc31e446557670d63ef7b339a32b03167d43b8ef08f8f8b#rd" target="_blank" rel="noopener noreferrer" class="">非LVM的xfs文件系统扩容</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485493&amp;idx=1&amp;sn=936b6dc64dea5c26a8f560272cec254a&amp;chksm=c1478d06f63004109956ea7e25f42a001fd4c8b73f6fc6d40c4aa220b00be0e5f1b8c7064764#rd" target="_blank" rel="noopener noreferrer" class="">DNS or hosts ？</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485020&amp;idx=1&amp;sn=af9f9df88e858bdcf76e9ca7075d7e89&amp;chksm=c147836ff6300a790160417514756b93fcedd8ec9c9baa00afa19ccddc1d665eb0dc705f030d#rd" target="_blank" rel="noopener noreferrer" class="">Tomcat调优整理</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484846&amp;idx=1&amp;sn=9aad99123f49a8f5d77cff81925d92ad&amp;chksm=c147809df630098ba97ec68bde0b60960b8926a370af007882b258a352f08f9d92c024f301ef#rd" target="_blank" rel="noopener noreferrer" class="">利用GoAccess分析web服务日志</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484956&amp;idx=1&amp;sn=277cfaa8604297d6275115f1307e6aad&amp;chksm=c147832ff6300a397b62edec3a7cfc12c9a88c6888b6586b7df934c371b10ce978578e6ab226#rd" target="_blank" rel="noopener noreferrer" class="">LVS负载均衡之DR模式</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484932&amp;idx=1&amp;sn=a9915b11cb5b3e2533bec119986bc18f&amp;chksm=c1478337f6300a21f7261a41e7c09734a46b13ccbd23dd130087b193cc597fac5fdd899f5d40#rd" target="_blank" rel="noopener noreferrer" class="">LVS负载均衡之NAT模式</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247483872&amp;idx=1&amp;sn=5c203be6ee99e12d09d5b6818cce199c&amp;chksm=c14784d3f6300dc57439da14c379f36d2fe2228c3fe9376de721b5e6c39250678f3ce28b8bf0#rd" target="_blank" rel="noopener noreferrer" class="">Nginx 目录浏览基础与进阶</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="其他杂文">其他杂文<a href="https://www.ssgeek.com/blog/2021-zong-jie-yu-gong-zhong-hao-wen-zhang-hui-gu/#%E5%85%B6%E4%BB%96%E6%9D%82%E6%96%87" class="hash-link" aria-label="其他杂文的直接链接" title="其他杂文的直接链接" translate="no">​</a></h3>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484726&amp;idx=1&amp;sn=b8efc2e4df151aef51b002510856d35d&amp;chksm=c1478005f6300913629ba167d6090ae3a9fb01f9f812aa0c07d0a9951ade02840077a5461637#rd" target="_blank" rel="noopener noreferrer" class="">我的生产力工具推荐-终端01篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484995&amp;idx=1&amp;sn=a4fcdb33dae8802b3a2f97a04c8452f5&amp;chksm=c1478370f6300a66e888782af016280b3f540a4667343ba02eaa130e3d3779cc785570aa0252#rd" target="_blank" rel="noopener noreferrer" class="">我的生产力工具推荐-IDE插件篇</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485876&amp;idx=1&amp;sn=85a3ec9dc9dea8ee83093885c3a52cc8&amp;chksm=c1478c87f63005919e8ea72210181075629094598847f0a73f8231f25c6f57509e289862b2a4#rd" target="_blank" rel="noopener noreferrer" class="">Mac + VMware Fusion + Windows11尝鲜</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247484557&amp;idx=1&amp;sn=8c1d98d7cd7a7d074cf2a5a12648e111&amp;chksm=c14781bef63008a8506829ad237fb0f0ec042542b3148e4115987ab07c215163ce4c89dab331#rd" target="_blank" rel="noopener noreferrer" class="">Mac下iTerm2配置lrzsz功能</a></p>
<p><a href="http://mp.weixin.qq.com/s?__biz=MzkxNzAzNDA3Ng==&amp;mid=2247485690&amp;idx=1&amp;sn=33cc1934b4c22949f8ad40b058bea36b&amp;chksm=c1478dc9f63004df01eb7a2444def3802a72dd4f561f0169222443236a44dbf272bd4c52d8c9#rd" target="_blank" rel="noopener noreferrer" class="">写在 2021 快要结束的夏天</a></p>
<br>
<p>年度总结就到这里</p>
<p>感谢身边时长陪伴与关心的人，感谢这一年来遇到的人和事，感谢所有公众号读者</p>
<p>新的一年继续保持初心，向大家分享更好的内容，一起进步</p>]]></content:encoded>
            <category>年度总结</category>
        </item>
        <item>
            <title><![CDATA[Golang与非对称加密]]></title>
            <link>https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/</link>
            <guid>https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/</guid>
            <pubDate>Fri, 31 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[golang]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="golang" src="https://www.ssgeek.com/assets/images/golang-750d8e6c343698d59ca6f2fe5d2317d9.png" width="2052" height="1364" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="非对称加密介绍">非对称加密介绍<a href="https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/#%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%E4%BB%8B%E7%BB%8D" class="hash-link" aria-label="非对称加密介绍的直接链接" title="非对称加密介绍的直接链接" translate="no">​</a></h2>
<p>非对称加密和对称加密不同，主要区别如下</p>
<ul>
<li class="">
<p>使用公钥加密，使用私钥解密</p>
</li>
<li class="">
<p>公钥和私钥不同</p>
</li>
<li class="">
<p>公钥可以公布给所有人</p>
</li>
<li class="">
<p>私钥只有自己保存</p>
</li>
<li class="">
<p>相比于对称加密，运算速度非常慢</p>
</li>
</ul>
<p>加密过程：明文+公钥——&gt;密文
解密过程：密文+私钥——&gt;明文</p>
<p>非对称加密算法常用于数据加密和身份认证, 常见的非对称加密算法如下</p>
<ul>
<li class="">
<p>RSA: 由RSA公司发明，是一个支持变长密钥的公共密钥算法，需要加密的文件块的长度也是可变的</p>
</li>
<li class="">
<p>DSA(Digital Signature Algorithm): 数字签名算法，是一种标准的<code>DSS</code>(数字签名标准)</p>
</li>
<li class="">
<p>ECC(Elliptic Curves Cryptography): 椭圆曲线密码编码学</p>
</li>
<li class="">
<p>ECDSA(Elliptic Curve Digital Signature Algorithm): 基于椭圆曲线的<code>DSA</code>签名算法</p>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="dsa">DSA<a href="https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/#dsa" class="hash-link" aria-label="DSA的直接链接" title="DSA的直接链接" translate="no">​</a></h2>
<p><code>DSA</code>是基于整数有限域离散对数难题的，其安全性与<code>RSA</code>相比差不多。<code>DSA</code>的一个重要特点是两个素数公开，这样，当使用别人的<code>p</code>和<code>q</code>时，即使不知道私钥，你也能确认它们是否是随机产生的，还是作了手脚。<code>RSA</code>算法却做不到，但是其缺点就是只能用于数字签名，不能用于加密</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="rsa">RSA<a href="https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/#rsa" class="hash-link" aria-label="RSA的直接链接" title="RSA的直接链接" translate="no">​</a></h2>
<p>在<code>1976</code>年，由于对称加密算法已经不能满足需要，<code>Diffie</code>和<code>Hellman</code>发表了一篇叫《密码学新动向》的文章，介绍了公匙加密的概念，由<code>Rivet</code>、<code>Shamir</code>、<code>Adelman</code>提出了<code>RSA</code>算法
<code>RSA</code>是目前最有影响力的公钥加密算法，它能够抵抗到目前为止已知的绝大多数密码攻击，已被<code>ISO</code>推荐为公钥数据加密标准</p>
<p>命名：Ron Rivest、Adi Shamir、Leonard Adleman</p>
<ul>
<li class="">密钥越长，越难破解，目前<code>768</code>位的密钥还无法破解（至少没人公开宣布），因此可以认为<code>1024</code>位的<code>RSA</code>密钥基本安全，<code>2048</code>位的密钥极其安全</li>
<li class=""><code>RSA</code>的算法原理主要用到了数论</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="rsa的加密过程">RSA的加密过程<a href="https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/#rsa%E7%9A%84%E5%8A%A0%E5%AF%86%E8%BF%87%E7%A8%8B" class="hash-link" aria-label="RSA的加密过程的直接链接" title="RSA的加密过程的直接链接" translate="no">​</a></h3>
<p>1、随机选择两个不相等的质数<code>p</code>和<code>q</code>，p=61，q=53</p>
<p>2、计算<code>p</code>和<code>q</code>的乘积，n=3233</p>
<p>3、计算<code>n</code>的欧拉函数∅(n) = (p-1)(q-1)，∅(n)=3120</p>
<p>4、随机选择一个整数<code>e</code>，使得1 &lt; e &lt; ∅(n)，且<code>e</code>与<code>∅(n)</code>互质，e=17</p>
<p>5、计算<code>e</code>对于<code>∅(n)</code>的模反元素d，即求解e*d + ∅(n)*y =1，d=2753，y=-15</p>
<p>6、将<code>n</code>和<code>e</code>封装成公钥，<code>n</code>和<code>d</code>封装成私钥，公钥=(3233, 17)，私钥=(3233, 2753)</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="调用示例">调用示例<a href="https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/#%E8%B0%83%E7%94%A8%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="调用示例的直接链接" title="调用示例的直接链接" translate="no">​</a></h3>
<p><code>RSA</code>使用示例代码</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/rand"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/rsa"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/sha1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/x509"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"encoding/pem"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 使用对方的公钥的数据, 只有对方的私钥才能解开</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">encrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plain </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> publicKey </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">cipherByte </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	msg </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plain</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 解码公钥</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	pubBlock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">_</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> pem</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Decode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">publicKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 读取公钥</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	pubKeyValue</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> x509</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ParsePKIXPublicKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">pubBlock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token function" style="color:rgb(130, 170, 255)">panic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	pub </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> pubKeyValue</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">rsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">PublicKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 加密数据方法: 不用使用EncryptPKCS1v15方法加密,源码里面推荐使用EncryptOAEP, 因此这里使用安全的方法加密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	encryptOAEP</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> rsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">EncryptOAEP</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> rand</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Reader</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> pub</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token function" style="color:rgb(130, 170, 255)">panic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	cipherByte </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> encryptOAEP</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 使用私钥解密公钥加密的数据</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">decrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">cipherByte </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> privateKey </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plainText </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 解析出私钥</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	priBlock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">_</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> pem</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Decode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">privateKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	priKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> x509</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ParsePKCS1PrivateKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">priBlock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token function" style="color:rgb(130, 170, 255)">panic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 解密RSA-OAEP方式加密后的内容</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	decryptOAEP</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> rsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">DecryptOAEP</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> rand</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Reader</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> priKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> cipherByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token function" style="color:rgb(130, 170, 255)">panic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	plainText </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">decryptOAEP</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">test</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	msg </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"Content bo be encrypted!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 获取公钥, 生产环境往往是文件中读取, 这里为了测试方便, 直接生成了.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	publicKeyData </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">`-----BEGIN PUBLIC KEY-----</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZsfv1qscqYdy4vY+P4e3cAtmv</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">ppXQcRvrF1cB4drkv0haU24Y7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0Dgacd</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">wYWd/7PeCELyEipZJL07Vro7Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NL</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">AUeJ6PeW+DAkmJWF6QIDAQAB</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">-----END PUBLIC KEY-----</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 获取私钥</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	privateKeyData </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">`-----BEGIN RSA PRIVATE KEY-----</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">MIICXQIBAAKBgQDZsfv1qscqYdy4vY+P4e3cAtmvppXQcRvrF1cB4drkv0haU24Y</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0DgacdwYWd/7PeCELyEipZJL07Vro7</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NLAUeJ6PeW+DAkmJWF6QIDAQAB</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">AoGBAJlNxenTQj6OfCl9FMR2jlMJjtMrtQT9InQEE7m3m7bLHeC+MCJOhmNVBjaM</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">ZpthDORdxIZ6oCuOf6Z2+Dl35lntGFh5J7S34UP2BWzF1IyyQfySCNexGNHKT1G1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">XKQtHmtc2gWWthEg+S6ciIyw2IGrrP2Rke81vYHExPrexf0hAkEA9Izb0MiYsMCB</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">/jemLJB0Lb3Y/B8xjGjQFFBQT7bmwBVjvZWZVpnMnXi9sWGdgUpxsCuAIROXjZ40</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">IRZ2C9EouwJBAOPjPvV8Sgw4vaseOqlJvSq/C/pIFx6RVznDGlc8bRg7SgTPpjHG</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">4G+M3mVgpCX1a/EU1mB+fhiJ2LAZ/pTtY6sCQGaW9NwIWu3DRIVGCSMm0mYh/3X9</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">DAcwLSJoctiODQ1Fq9rreDE5QfpJnaJdJfsIJNtX1F+L3YceeBXtW0Ynz2MCQBI8</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">9KP274Is5FkWkUFNKnuKUK4WKOuEXEO+LpR+vIhs7k6WQ8nGDd4/mujoJBr5mkrw</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">DPwqA3N5TMNDQVGv8gMCQQCaKGJgWYgvo3/milFfImbp+m7/Y3vCptarldXrYQWO</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">AQjxwc71ZGBFDITYvdgJM1MTqc8xQek1FXn1vfpy2c6O</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">-----END RSA PRIVATE KEY-----</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	cipherData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">encrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> publicKeyData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token function" style="color:rgb(130, 170, 255)">panic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"encrypt message: %x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> cipherData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	plainData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">decrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">cipherData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> privateKeyData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token function" style="color:rgb(130, 170, 255)">panic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"decrypt message:%s\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> plainData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token function" style="color:rgb(130, 170, 255)">test</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ecc">ECC<a href="https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/#ecc" class="hash-link" aria-label="ECC的直接链接" title="ECC的直接链接" translate="no">​</a></h2>
<p><code>ECC</code>又称椭圆曲线加密</p>
<p><code>ECC</code>（Elliptic Curve Cryptography）椭圆曲线加密算法，相比<code>RSA</code>，<code>ECC</code>可以使用更短的密钥，来实现与<code>RSA</code>相当或更高的安全</p>
<p>定义了椭圆曲线上的加法和二倍运算</p>
<p>椭圆曲线依赖的数学难题是：<code>k</code>为正整数，<code>p</code>是椭圆曲线上的点（称为基点），k*p=Q，已知<code>Q</code>和<code>P</code>，很难计算出k</p>
<p><code>ECC</code>是建立在基于椭圆曲线的离散对数的难度, 大概过程如下：</p>
<p>给定椭圆曲线上的一个点P，一个整数k，求解Q=kP很容易；给定一个点P、Q，知道Q=kP，求整数k确是一个难题。ECDH即建立在此数学难题之上</p>
<p>今天只有短的<code>RSA</code>钥匙才可能被强力方式解破。到<code>2008</code>年为止，世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长，用<code>RSA</code>加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天，<code>RSA</code>加密安全性受到了挑战</p>
<p>随着分解大整数方法的进步及完善、计算机速度的提高以及计算机网络的发展，为了保障数据的安全，<code>RSA</code>的密钥需要不断增加，但是，密钥长度的增加导致了其加解密的速度大为降低，硬件实现也变得越来越难以忍受，这对使用<code>RSA</code>的应用带来了很重的负担，因此需要一种新的算法来代替<code>RSA</code></p>
<p><code>1985</code>年<code>N.Koblitz</code>和<code>Miller</code>提出将椭圆曲线用于密码算法，根据是有限域上的椭圆曲线上的点群中的离散对数问题<code>ECDLP</code>。<code>ECDLP</code>是比因子分解问题更难的问题，它是指数级的难度</p>
<p>椭圆曲线算法因参数不同有多种类型, 这个网站列出了现阶段那些<code>ECC</code>是相对安全的:椭圆曲线算法安全列表, 而<code>curve25519</code>便是其中的佼佼者</p>
<p><code>Curve25519/Ed25519/X25519</code>是著名密码学家<code>Daniel J. Bernstein</code>在<code>2006</code>年独立设计的椭圆曲线加密/签名/密钥交换算法, 和现有的任何椭圆曲线算法都完全独立
特点是：</p>
<ul>
<li class="">完全开放设计: 算法各参数的选择直截了当，非常明确，没有任何可疑之处，相比之下目前广泛使用的椭圆曲线是NIST系列标准，方程的系数是使用来历不明的随机种子 c49d3608 86e70493 6a6678e1 139d26b7 819f7e90 生成的，非常可疑，疑似后门；</li>
<li class="">高安全性： 一个椭圆曲线加密算法就算在数学上是安全的，在实用上也并不一定安全，有很大的概率通过缓存、时间、恶意输入摧毁安全性，而25519系列椭圆曲线经过特别设计，尽可能的将出错的概率降到了最低，可以说是实践上最安全的加密算法。例如，任何一个32位随机数都是一个合法的X25519公钥，因此通过恶意数值攻击是不可能的，算法在设计的时候刻意避免的某些分支操作，这样在编程的时候可以不使用if ，减少了不同if分支代码执行时间不同的时序攻击概率，相反， NIST系列椭圆曲线算法在实际应用中出错的可能性非常大，而且对于某些理论攻击的免疫能力不高， Bernstein 对市面上所有的加密算法使用12个标准进行了考察， 25519是几乎唯一满足这些标准的；</li>
<li class="">速度快: 25519系列曲线是目前最快的椭圆曲线加密算法，性能远远超过NIST系列，而且具有比P-256更高的安全性；</li>
<li class="">作者功底深厚: Daniel J. Bernstein是世界著名的密码学家，他在大学曾经开设过一门 UNIX 系统安全的课程给学生，结果一学期下来，发现了 UNIX 程序中的 91 个安全漏洞；他早年在美国依然禁止出口加密算法时，曾因为把自己设计的加密算法发布到网上遭到了美国政府的起诉，他本人抗争六年，最后美国政府撤销所有指控，目前另一个非常火的高性能安全流密码 ChaCha20 也是出自 Bernstein 之手；</li>
<li class="">下一代的标准: 25519系列曲线自2006年发表以来，除了学术界无人问津， 2013 年爱德华·斯诺登曝光棱镜计划后，该算法突然大火，大量软件，如OpenSSH都迅速增加了对25519系列的支持，如今25519已经是大势所趋，可疑的NIST曲线迟早要退出椭圆曲线的历史舞台，目前， RFC增加了SSL/TLS对X25519密钥交换协议的支持，OpenSSL 1.1也加入支持，是摆脱老大哥的第一步，下一步是将 Ed25519做为可选的TLS证书签名算法，彻底摆脱NIST</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ecc与rsa的比较">ECC与RSA的比较<a href="https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/#ecc%E4%B8%8Ersa%E7%9A%84%E6%AF%94%E8%BE%83" class="hash-link" aria-label="ECC与RSA的比较的直接链接" title="ECC与RSA的��比较的直接链接" translate="no">​</a></h2>
<p><code>ECC</code>和<code>RSA</code>相比，在许多方面都有对绝对的优势，主要体现在以下方面：</p>
<ul>
<li class="">抗攻击性强。相同的密钥长度，其抗攻击性要强很多倍</li>
<li class="">计算量小，处理速度快。<code>ECC</code>总的速度比<code>RSA</code>、<code>DSA</code>要快得多</li>
<li class="">存储空间占用小。<code>ECC</code>的密钥尺寸和系统参数与<code>RSA</code>、<code>DSA</code>相比要小得多，意味着它所占的存贮空间要小得多。这对于加密算法在<code>IC</code>卡上的应用具有特别重要的意义</li>
<li class="">带宽要求低。当对长消息进行加解密时，三类密码系统有相同的带宽要求，但应用于短消息时<code>ECC</code>带宽要求却低得多。带宽要求低使<code>ECC</code>在无线网络领域具有广泛的应用前景</li>
</ul>
<p><code>ECC</code>的这些特点使它必将取代<code>RSA</code>，成为通用的公钥加密算法。比如<code>SET</code>协议的制定者已把它作为下一代<code>SET</code>协议中缺省的公钥密码算法</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ecdsa">ECDSA<a href="https://www.ssgeek.com/blog/golang-yu-fei-dui-cheng-jia-mi/#ecdsa" class="hash-link" aria-label="ECDSA的直接链接" title="ECDSA的直接链接" translate="no">​</a></h2>
<p>因为在数字签名的安全性高, 基于<code>ECC</code>的<code>DSA</code>更高, 所以非常适合数字签名使用场景, 在<code>SSH TLS</code>有广泛使用, <code>ECC</code>把离散对数安全性高很少，所以<code>ECC</code>在安全领域会成为下一个标准</p>
<p>在<code>golang</code>的<code>ssh</code>库中就是使用这个算法来签名的：<code>A</code>使用自己的私钥签名一段数据，然后将公钥发放出去。用户拿到公钥后，验证数据的签名,如果通过则证明数据来源是<code>A</code>，从而达到身份认证的作用</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/ecdsa"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/elliptic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/md5"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/rand"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"hash"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"io"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"math/big"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// SignData 用于保存签名的数据</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">type</span><span class="token plain"> SignData </span><span class="token keyword" style="font-style:italic">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	r         </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">big</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Int</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	s         </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">big</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Int</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	signhash  </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	signature </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 使用私钥签名一段数据</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">sign</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">message </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> privateKey </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">ecdsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">PrivateKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">signData </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">SignData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 签名数据</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">var</span><span class="token plain"> h hash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Hash</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	h </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> md5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	r </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> big</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewInt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	s </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> big</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewInt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	io</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">WriteString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">h</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	signhash </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> h</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	r</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> s</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> serr </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> ecdsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sign</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">rand</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Reader</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> privateKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> signhash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> serr </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> serr</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	signature </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	signature </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">append</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">signature</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> s</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	signData </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token plain">SignData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		r</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">         r</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		s</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">         s</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		signhash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">  </span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token plain">signhash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		signature</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token plain">signature</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 校验数字签名</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">verifySign</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">signData </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">SignData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> publicKey </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">ecdsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">PublicKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">status </span><span class="token builtin" style="color:rgb(130, 170, 255)">bool</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	status </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> ecdsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Verify</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">publicKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">signData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">signhash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> signData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">r</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> signData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">test</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//使用椭圆曲线的P256算法,现在一共也就实现了4种,我们使用折中一种,具体见http://golang.org/pkg/crypto/elliptic/#P256</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	pubkeyCurve </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> elliptic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">P256</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	privateKey </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">new</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">ecdsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">PrivateKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 生成秘钥对</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	privateKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> ecdsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">GenerateKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">pubkeyCurve</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> rand</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Reader</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token function" style="color:rgb(130, 170, 255)">panic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">var</span><span class="token plain"> publicKey ecdsa</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">PublicKey</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	publicKey </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> privateKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">PublicKey</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 签名</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	signData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">sign</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"This is a message to be signed and verified by ECDSA!"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> privateKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token function" style="color:rgb(130, 170, 255)">panic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"The signhash: %x\nThe signature: %x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">signData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">signhash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">signData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">signature</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 验证</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	status </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">verifySign</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">signData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token plain">publicKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"The verify result is: %v\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> status</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token function" style="color:rgb(130, 170, 255)">test</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>See you ~</p>]]></content:encoded>
            <category>Golang</category>
        </item>
        <item>
            <title><![CDATA[Ack集群Terway网络场景下的vSwitch扩容]]></title>
            <link>https://www.ssgeek.com/blog/ack-ji-qun-terway-wang-luo-chang-jing-xia-de-vswitch-kuo-rong/</link>
            <guid>https://www.ssgeek.com/blog/ack-ji-qun-terway-wang-luo-chang-jing-xia-de-vswitch-kuo-rong/</guid>
            <pubDate>Tue, 28 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[20211228-01]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="20211228-01" src="https://www.ssgeek.com/assets/images/20211228-01-99e84a04047a1e02f7733f63121dbbe1.png" width="1850" height="739" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="terway网络介绍">Terway网络介绍<a href="https://www.ssgeek.com/blog/ack-ji-qun-terway-wang-luo-chang-jing-xia-de-vswitch-kuo-rong/#terway%E7%BD%91%E7%BB%9C%E4%BB%8B%E7%BB%8D" class="hash-link" aria-label="Terway网络介绍的直接链接" title="Terway网络介绍的直接链接" translate="no">​</a></h2>
<p><code>Terway</code>是阿里云开源的基于专有网络VPC的容器网络接口<code>CNI</code>（Container Network Interface）插件，支持基于<code>Kubernetes</code>标准的网络策略来定义容器间的访问策略。可以通过使用<code>Terway</code>网络插件实现<code>Kubernetes</code>集群内部的网络互通</p>
<p><code>Terway</code>网络插件将原生的弹性网卡分配给<code>Pod</code>实现<code>Pod</code>网络，支持基于<code>Kubernetes</code>标准的网络策略（Network Policy）来定义容器间的访问策略，并兼容<code>Calico</code>的网络策略</p>
<p>在<code>Terway</code>网络插件中，每个<code>Pod</code>都拥有自己网络栈和<code>IP</code>地址。同一台<code>ECS</code>内的<code>Pod</code>之间通信，直接通过机器内部的转发，跨<code>ECS</code>的<code>Pod</code>通信，报文通过<code>VPC</code>的弹性网卡直接转发。由于不需要使用<code>VxLAN</code>等的隧道技术封装报文，因此<code>Terway</code>模式网络具有较高的通信性能</p>
<p>一句话总结，<code>Terway</code>最大的特点就是借助于云上<code>ECS</code>服务器的特性，将<code>pod</code>与<code>node</code>的网络进行了拉平，同时使用<code>VPC</code>下<code>vSwitch</code>中的<code>ip</code></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="问题现象">问题现象<a href="https://www.ssgeek.com/blog/ack-ji-qun-terway-wang-luo-chang-jing-xia-de-vswitch-kuo-rong/#%E9%97%AE%E9%A2%98%E7%8E%B0%E8%B1%A1" class="hash-link" aria-label="问题现象的直接链接" title="问题现象的直接链接" translate="no">​</a></h2>
<p>由于使用了<code>Terway</code>网络模式，随着<code>node</code>机器和<code>pod</code>数量的增多，每分配一个<code>ip</code>出去都需要消耗掉<code>vpc</code>下<code>vsw</code>的可用<code>ip</code>。如果某短时间业务快速增长，导致<code>pod</code>大量消耗可用<code>ip</code>，这个时候就有可能因前期规划不充足导致<code>vSwitch</code>的可用<code>ip</code>不足</p>
<p>这个时候新创建的<code>pod</code>状态为<code>ContainerCreating</code>，<code>describe</code>查看<code>pod</code>提示<code>error allocate ip...</code>，这个时候查看<code>Pod</code>所在节点的<code>Terway</code>的日志，会有下面内容</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">Message: The specified VSwitch </span><span class="token string" style="color:rgb(195, 232, 141)">"vsw-xxxxx"</span><span class="token plain"> has not enough IpAddress.</span><br></div></code></pre></div></div>
<p>提示没有足够的<code>ip</code>，这个时候基本都是由于交换机的<code>ip</code>不够用，登录到交换机的控制台可以查看到这个节点所在的交换机的可用<code>ip</code>数，如果很少甚至为<code>0</code>，就表示需要扩容了</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="扩容操作">扩容操作<a href="https://www.ssgeek.com/blog/ack-ji-qun-terway-wang-luo-chang-jing-xia-de-vswitch-kuo-rong/#%E6%89%A9%E5%AE%B9%E6%93%8D%E4%BD%9C" class="hash-link" aria-label="扩容操作的直接链接" title="扩容操作的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="新增交换机并配置nat">新增交换机并配置NAT<a href="https://www.ssgeek.com/blog/ack-ji-qun-terway-wang-luo-chang-jing-xia-de-vswitch-kuo-rong/#%E6%96%B0%E5%A2%9E%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B9%B6%E9%85%8D%E7%BD%AEnat" class="hash-link" aria-label="新增交换机并配置NAT的直接链接" title="新增交换机并配置NAT的直接链接" translate="no">​</a></h3>
<p>在专有网络管理控制台对应的<code>VPC</code>创建新的<code>vSwitch</code>，该<code>vSwitch</code>必须与<code>IP</code>资源不足的<code>vSwitch</code>在同一个区域。这是因为<code>Terway</code>分配给<code>pod ip</code>时的策略是，分配<code>node</code>所在可用区中的<code>vSwitch</code>对应的<code>ip</code>，因此，扩容就需要扩容同一可用区的交换机</p>
<p>在初始化集群新建交换机以及扩容交换机的时候都应该考虑，因<code>Pod</code>密度越来越大，为了满足<code>Pod</code>对<code>IP</code>地址日益增长的需求，建议创建给<code>Pod</code>使用的<code>vSwitch</code>的网络位小于等于<code>19</code>，即每个网段中至少包含<code>8192</code>个可用<code>IP</code>地址</p>
<p><img decoding="async" loading="lazy" alt="20211228-02" src="https://www.ssgeek.com/assets/images/20211228-02-5b1bfb4b80de9ab7abc677762413fdef.png" width="1440" height="1572" class="img_ev3q"></p>
<p><code>vSwitch</code>创建完成后，需要对这个<code>vSwitch</code>配置<code>NAT</code>策略，以便访问外部网络</p>
<p><img decoding="async" loading="lazy" alt="20211228-03" src="https://www.ssgeek.com/assets/images/20211228-03-cc39b4fd19cbf95041775ea6e74c4173.png" width="1868" height="1726" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="配置集群的terway">配置集群的Terway<a href="https://www.ssgeek.com/blog/ack-ji-qun-terway-wang-luo-chang-jing-xia-de-vswitch-kuo-rong/#%E9%85%8D%E7%BD%AE%E9%9B%86%E7%BE%A4%E7%9A%84terway" class="hash-link" aria-label="配置集群的Terway的直接链接" title="配置集群的Terway的直接链接" translate="no">​</a></h3>
<p>配置集群的<code>Terway</code>，添加上面创建的<code>vSwitch</code>到<code>Terway</code>的<code>ConfigMap</code>配置中</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-n</span><span class="token plain"> kube-system edit cm eni-config</span><br></div></code></pre></div></div>
<p>配置样例参考<a href="https://github.com/AliyunContainerService/terway/blob/main/docs/dynamic-config.md" target="_blank" rel="noopener noreferrer" class="">Terway配置参考</a>，部分内容说明如下</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ConfigMap</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> eni</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">config</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kube</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">10-terway.conf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"cniVersion"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"0.3.0"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"name"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"terway"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"terway"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">disable_network_policy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">eni_conf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"version"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"1"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 版本</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"max_pool_size"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">80</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 资源池最大水位</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"min_pool_size"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 资源池最小水位</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"credential_path"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"/var/addon/token-config"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"vswitches"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">"cn</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">shanghai</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">f"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"vsw-AAA"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"vsw-BBB"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 关联的虚拟交换机(ENI多IP模式)，添加vsw-BBB到VSwitches部分，其中vsw-AAA是已经存在的且IP资源不足的VSwitch</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"eni_tags"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">"ack.aliyun.com"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token string" style="color:rgb(195, 232, 141)">"xxxxxxxxx"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"service_cidr"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"172.16.0.0/16"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 服务CIDR</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"security_group"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"sg-xxxxxxx"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 安全组ID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">"vswitch_selection_policy"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"ordered"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>上面配置参数中，资源池水位的配置值。<code>Terway</code>使用底层虚拟化底层的网络资源打通容器网络，网络资源的创建和释放需要一系列的<code>API</code>调用，如果在<code>Pod</code>创建销毁时频繁调用<code>API</code>会导致<code>Pod</code>配置时间较长。 <code>Terway</code>通过池化的方式对资源进行缓存，当小于资源的池的最小水位时自动补充资源，在大于资源池最大水位时开始释放资源，这样保障了高效的资源利用和分配的效率</p>
<p>相当于预先分配了<code>ip</code>，具体设置可以考虑到所在机器节点规格支持的最大<code>eni</code>辅助网卡个数以及最大<code>pod</code>数灵活设置</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="重启terway">重启terway<a href="https://www.ssgeek.com/blog/ack-ji-qun-terway-wang-luo-chang-jing-xia-de-vswitch-kuo-rong/#%E9%87%8D%E5%90%AFterway" class="hash-link" aria-label="重启terway的直接链接" title="重启terway的直接链接" translate="no">​</a></h3>
<p>重启所有<code>Terway</code>的<code>pod</code>以便快速刷新缓存生效</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># kubectl -n kube-system delete pod -l app=terway-eniip</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># kubectl -n kube-system get pod | grep terway</span><br></div></code></pre></div></div>
<p>重启后检查异常的<code>pod</code>是否正常获取了<code>ip</code>即可</p>
<p>当排查某个<code>pod</code>的<code>ip</code>分配相关问题时，也可以通过进入到所在节点的<code>terway pod</code>中，执行命令行，查看当前已分配的ip情况，以及已经从<code>vSwitch</code>分配得来后，暂时空闲的<code>ip</code>情况</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># terway-cli mapping</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Status </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> Pod Name                                               </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> Res ID                           </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> Factory Res ID</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Normal </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> node-problem-detector-l5h52                            </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> 00:16:10:48:3e:37.10.244.18.167 </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> 00:16:10:48:3e:37.10.244.18.167</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token plain">.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Idle   </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain">                                                        </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> 00:16:10:48:3e:37.10.244.18.132 </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> 00:16:10:48:3e:37.10.244.18.132</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Idle   </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain">                                                        </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> 00:16:10:48:3e:37.10.244.18.18  </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> 00:16:10:48:3e:37.10.244.18.18</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Idle   </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain">                                                        </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> 00:16:10:48:3e:37.10.244.18.54  </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> 00:16:10:48:3e:37.10.244.18.54</span><br></div></code></pre></div></div>
<p>See you ~</p>]]></content:encoded>
            <category>云原生</category>
            <category>k8s</category>
            <category>kubernetes</category>
            <category>ack</category>
        </item>
        <item>
            <title><![CDATA[Golang与对称加密]]></title>
            <link>https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/</link>
            <guid>https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/</guid>
            <pubDate>Thu, 23 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[golang]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="golang" src="https://www.ssgeek.com/assets/images/golang-750d8e6c343698d59ca6f2fe5d2317d9.png" width="2052" height="1364" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="对称加密介绍">对称加密介绍<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%E4%BB%8B%E7%BB%8D" class="hash-link" aria-label="对称加密介绍的直接链接" title="对称加密介绍的直接链接" translate="no">​</a></h2>
<p>对称加密算法用来对敏感数据等信息进行加密，常用的算法包括：</p>
<ul>
<li class="">DES(Data Encryption Standard)：数据加密标准，速度较快，适用于加密大量数据的场合</li>
<li class="">3DES(Triple DES)：是基于<code>DES</code>，对一块数据用三个不同的密钥进行三次加密，强度更高</li>
<li class="">AES(Advanced Encryption Standard)：高级加密标准，是下一代的加密算法标准，速度快，安全级别高</li>
<li class="">CBC 分组加密的四种模式之一<code>ECB</code>、<code>CBC</code>、<code>CFB</code>、<code>OFB</code></li>
</ul>
<p>对称加密又分为分组加密和序列密码</p>
<ul>
<li class="">
<p>分组密码，也叫块加密<code>block cyphers</code>，一次加密明文中的一个块。是将明文按一定的位长分组，明文组经过加密运算得到密文组，密文组经过解密运算（加密运算的逆运算），还原成明文组</p>
</li>
<li class="">
<p>序列密码，也叫流加密<code>stream cyphers</code>，一次加密明文中的一个位。是指利用少量的密钥（制乱元素）通过某种复杂的运算（密码算法）产生大量的伪随机位流，用于对明文位流的加密</p>
</li>
</ul>
<p>对称加密的特点</p>
<ul>
<li class="">
<p>加密过程每一步都是可逆的</p>
</li>
<li class="">
<p>加密和解密用的是同一组密钥</p>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="des">DES<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#des" class="hash-link" aria-label="DES的直接链接" title="DES的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="概述">概述<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#%E6%A6%82%E8%BF%B0" class="hash-link" aria-label="概述的直接链接" title="概述的直接链接" translate="no">​</a></h3>
<p>DES（<code>Data Encryption Standard</code>）数据加密标准，是目前最为流行的加密算法之一
DES是一种使用密钥加密的块算法，<code>1977</code>年被美国联邦政府的国家标准局确定为联邦资料处理标准<code>FIPS</code>，并授权在非密级政府通信中使用，随后该算法在国际上广泛流传开来</p>
<p>AES与3DES的比较</p>
<table><thead><tr><th>算法名称</th><th>算法类型</th><th>密钥长度</th><th>速度</th><th>解密时间（建设机器每秒尝试255个密钥）</th><th>资源消耗</th></tr></thead><tbody><tr><td>AES</td><td>对称block密码</td><td>128、192、256位</td><td>高</td><td>1490000亿年</td><td>低</td></tr><tr><td>3DES</td><td>对称feistel密码</td><td>112位或168位</td><td>低</td><td>46亿年</td><td>中</td></tr></tbody></table>
<p>破解历史</p>
<p>历史上有三次对<code>DES</code>有影响的攻击实验。<code>1997</code>年，利用当时各国 <code>7</code>万台计算机，历时<code>96</code>天破解了<code>DES</code>的密钥。<code>1998</code>年，电子边境基金会（EFF）用<code>25</code>万美元制造的专用计算机，用<code>56</code>小时破解了<code>DES</code>的密钥。1999年，<code>EFF</code>用<code>22</code>小时<code>15</code>分完成了破解工作</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="主要思路">主要思路<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#%E4%B8%BB%E8%A6%81%E6%80%9D%E8%B7%AF" class="hash-link" aria-label="主要思路的直接链接" title="主要思路的直接链接" translate="no">​</a></h3>
<p>对原始数据（明文）进行分组，每组<code>64</code>位<code>bit</code>，最后一组不足<code>64</code>位时按一定规则填充，每一组上单独施加<code>DES</code>算法</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="des子密钥生成">DES子密钥生成<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#des%E5%AD%90%E5%AF%86%E9%92%A5%E7%94%9F%E6%88%90" class="hash-link" aria-label="DES子密钥生成的直接链接" title="DES子密钥生成的直接链接" translate="no">​</a></h3>
<ul>
<li class="">第一步</li>
</ul>
<p>初始密钥<code>64</code>位，实际有效位<code>56</code>位，每隔<code>7</code>位有一个校验位
根据初始密钥生成<code>16</code>个<code>48</code>位的字密钥</p>
<p>密钥置换（打散），64——&gt;56
<img decoding="async" loading="lazy" alt="20211223-01" src="https://www.ssgeek.com/assets/images/20211223-01-cf5add109b42329921f8daa900301b9f.png" width="889" height="352" class="img_ev3q"></p>
<p>例如，第<code>57</code>位放在第<code>1</code>个位置，第<code>49</code>位放在第<code>2</code>个位置，将顺序打乱并去除了校验位</p>
<ul>
<li class="">第二步</li>
</ul>
<p>左旋右旋，再次置换56——&gt;48
<img decoding="async" loading="lazy" alt="20211223-02" src="https://www.ssgeek.com/assets/images/20211223-02-6d285a3d8cabcbf9c8eabbc709cf6324.png" width="943" height="374" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="des加密过程">DES加密过程<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#des%E5%8A%A0%E5%AF%86%E8%BF%87%E7%A8%8B" class="hash-link" aria-label="DES加密过程的直接链接" title="DES加密过程的直接链接" translate="no">​</a></h3>
<p>明文——&gt;初始置换——&gt;L0(<code>32</code>位)、R0(<code>32</code>位)
<img decoding="async" loading="lazy" alt="20211223-03" src="https://www.ssgeek.com/assets/images/20211223-03-002bef847b36162689c986393471df14.png" width="1646" height="734" class="img_ev3q"></p>
<p><code>S</code>盒替换的逻辑
输入<code>48</code>位，输出<code>32</code>位，各分为<code>8</code>组，输入每组<code>6</code>位，输出每组<code>4</code>位
分别在每组上施加<code>S</code>盒替换，一共<code>8</code>个<code>S</code>盒</p>
<p><img decoding="async" loading="lazy" alt="20211223-04" src="https://www.ssgeek.com/assets/images/20211223-04-85239626854e4643e6b177bee2a605eb.png" width="1514" height="438" class="img_ev3q"></p>
<p>合并
L16(<code>32</code>位)、R16(<code>32</code>位)——&gt;合并——&gt;最终置换——&gt;密文（<code>64</code>位）</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="使用示例">使用示例<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="使用示例的直接链接" title="使用示例的直接链接" translate="no">​</a></h3>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">DesEncrypt DES加密</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//密钥必须是64位，所以key必须是长度为8的byte数组</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">DesEncrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">text </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Errorf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"DES加密算法要求key必须是64位bit"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> des</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//用des创建一个加密器cipher</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	src </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	blockSize </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">BlockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">           </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//分组的大小，blockSize=8</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	src </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> common</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ZeroPadding</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//填充成64位整倍数</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	out </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">make</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//密文和明文的长度一致</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	dst </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> out</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">for</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//分组加密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Encrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">dst</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//对src进行加密，加密结果放到dst里</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//移到下一组</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		src </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		dst </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> dst</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> hex</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">EncodeToString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">out</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//DesDecrypt DES解密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//密钥必须是64位，所以key必须是长度为8的byte数组</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">DesDecrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">text </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> hex</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">DecodeString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//转成[]byte</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> des</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	blockSize </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">BlockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	out </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">make</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	dst </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> out</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">for</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//分组解密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Decrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">dst</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		src </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		dst </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> dst</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	out </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> common</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ZeroUnPadding</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">out</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//反填充</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">out</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="分组模式">分组模式<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#%E5%88%86%E7%BB%84%E6%A8%A1%E5%BC%8F" class="hash-link" aria-label="分组模式的直接链接" title="分组模式的直接链接" translate="no">​</a></h3>
<ul>
<li class="">CBC（Cipher Block Chaining）密文分组链接模式，将当前明文分组与前一个密文分组进行异或运算，然后再进行加密</li>
<li class="">其他分组模式还有ECB、CTR、CFR、OFB</li>
</ul>
<p>分组模式使用示例</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">DesEncryptCBC</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">text </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	src </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> des</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//用des创建一个加密器cipher</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	blockSize </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">BlockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">           </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//分组的大小，blockSize=8</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	src </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> common</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ZeroPadding</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//填充</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	out </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">make</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">                   </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//密文和明文的长度一致</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	encrypter </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> cipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCBCEncrypter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//CBC分组模式加密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	encrypter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">CryptBlocks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">out</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> hex</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">EncodeToString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">out</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">DesDecryptCBC</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">text </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> hex</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">DecodeString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//转成[]byte</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> des</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	out </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">make</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">                   </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//密文和明文的长度一致</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	encrypter </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> cipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCBCDecrypter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//CBC分组模式解密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	encrypter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">CryptBlocks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">out</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	out </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> common</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ZeroUnPadding</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">out</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//反填充</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">out</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="aes">AES<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#aes" class="hash-link" aria-label="AES的直接链接" title="AES的直接链接" translate="no">​</a></h2>
<p>AES（<code>Advanced Encryption Standard</code>）高级加密标准，旨在取代<code>DES</code></p>
<p><code>2000</code>年<code>10</code>月，<code>NIST</code>(美国国家标准和技术协会)宣布通过从<code>15</code>种侯选算法中选出的一项新的密匙加密标准。<code>Rijndael</code>被选中成为将来的<code>AES</code>。 <code>Rijndael</code>是在<code>1999</code>年下半年，由研究员<code>Joan Daemen</code>和<code>Vincent Rijmen</code>创建的。<code>AES</code>正日益成为加密各种形式的电子数据的实际标准
并于<code>2002</code>年<code>5</code>月<code>26</code>日制定了新的高级加密标准<code>AES</code>规范</p>
<p>算法原理</p>
<p><code>AES</code>算法基于排列和置换运算。排列是对数据重新进行安排，置换是将一个数据单元替换为另一个。<code>AES</code>使用几种不同的方法来执行排列和置换运算。
<code>AES</code>是一个迭代的、对称密钥分组的密码，它可以使用<code>128</code>、<code>192</code>和<code>256</code>位密钥，并且用<code>128</code>位（<code>16</code>字节）分组加密和解密数据。与公共密钥密码使用密钥对不同，对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构，在该循环中重复置换和替换输入数据</p>
<p>综上看来<code>AES</code>安全度最高, 基本现状就是<code>AES</code>已经替代<code>DES</code>成为新一代对称加密的标准</p>
<p><code>AES</code>使用示例</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/aes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/cipher"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">var</span><span class="token plain"> commonIV </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token number" style="color:rgb(247, 140, 108)">0x00</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x01</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x02</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x03</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x04</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x05</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x06</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x07</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x08</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x09</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x0a</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x0b</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x0c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x0d</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x0e</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0x0f</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">encrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plainText </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> keyText </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">cipherByte </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 转换成字节数据, 方便加密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	plainByte </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plainText</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	keyByte </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">keyText</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 创建加密算法aes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> aes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">keyByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//加密字符串</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	cfb </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> cipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCFBEncrypter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> commonIV</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	cipherByte </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">make</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plainByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	cfb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">XORKeyStream</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">cipherByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> plainByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">decrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">cipherByte </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> keyText </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plainText </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 转换成字节数据, 方便加密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	keyByte </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">keyText</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 创建加密算法aes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> aes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">keyByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 解密字符串</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	cfbdec </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> cipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCFBDecrypter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">c</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> commonIV</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	plainByte </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">make</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">cipherByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	cfbdec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">XORKeyStream</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plainByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> cipherByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	plainText </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plainByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	plain </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"The text need to be encrypt."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// AES 规定有3种长度的key: 16, 24, 32分别对应AES-128, AES-192, or AES-256</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	key </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"abcdefgehjhijkmlkjjwwoew"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 加密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	cipherByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">encrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">plain</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Println</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"%s ==&gt; %x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> plain</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> cipherByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 解密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	plainText</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">decrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">cipherByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Println</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"%x ==&gt; %s\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> cipherByte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> plainText</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cbc">CBC<a href="https://www.ssgeek.com/blog/golang-yu-dui-cheng-jia-mi/#cbc" class="hash-link" aria-label="CBC的直接链接" title="CBC的直接链接" translate="no">​</a></h2>
<p>分组密码，也叫块加密<code>block cyphers</code>，一次加密明文中的一个块。是将明文按一定的位长分组，明文组经过加密运算得到密文组，密文组经过解密运算（加密运算的逆运算），还原成明文组。
序列密码，也叫流加密<code>stream cyphers</code>，一次加密明文中的一个位。是指利用少量的密钥（制乱元素）通过某种复杂的运算（密码算法）产生大量的伪随机位流，用于对明文位流的加密。
解密是指用同样的密钥和密码算法及与加密相同的伪随机位流，用以还原明文位流</p>
<p>分组加密算法中，有<code>ECB</code>,<code>CBC</code>,<code>CFB</code>,<code>OFB</code>这几种算法模式, 我们介绍其中常用的一种<code>CBC</code></p>
<p><code>CBC</code>(<code>Cipher Block Chaining</code>)密文分组链接方式</p>
<p>加密步骤如下：</p>
<ul>
<li class="">首先将数据按照8个字节一组进行分组得到<code>D1D2......Dn</code>（若数据不是8的整数倍，用指定的<code>PADDING</code>数据补位）</li>
<li class="">第一组数据<code>D1</code>与初始化向量I异或后的结果进行<code>DES</code>加密得到第一组密文<code>C1</code>（初始化向量I为全零）</li>
<li class="">第二组数据<code>D2</code>与第一组的加密结果<code>C1</code>异或以后的结果进行<code>DES</code>加密，得到第二组密文<code>C2</code></li>
<li class="">之后的数据以此类推，得到<code>Cn</code></li>
<li class="">按顺序连为<code>C1C2C3......Cn</code>即为加密结果</li>
</ul>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// aesCBCEncrypt aes加密，填充秘钥key的16位，24,32分别对应AES-128, AES-192, or AES-256.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">aesCBCEncrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">rawData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> aes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//填充原文</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	blockSize </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">BlockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	rawData </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">pkcs7Padding</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">rawData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//初始向量IV必须是唯一，但不需要保密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	cipherText </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">make</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> blockSize</span><span class="token operator" style="color:rgb(137, 221, 255)">+</span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">rawData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//block大小 16</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	iv </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> cipherText</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">_</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> io</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ReadFull</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">rand</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Reader</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> iv</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//block大小和初始向量大小一定要一致</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	mode </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> cipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCBCEncrypter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> iv</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	mode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">CryptBlocks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">cipherText</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> rawData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> cipherText</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>解密是加密的逆过程，步骤如下：</p>
<ul>
<li class="">首先将数据按照<code>8</code>个字节一组进行分组得到<code>C1C2C3......Cn</code></li>
<li class="">将第一组数据进行解密后与初始化向量<code>I</code>进行异或得到第一组明文<code>D1</code>（注意：一定是先解密再异或）</li>
<li class="">将第二组数据<code>C2</code>进行解密后与第一组密文数据进行异或得到第二组数据<code>D2</code></li>
<li class="">之后依此类推，得到<code>Dn</code></li>
<li class="">按顺序连为<code>D1D2D3......Dn</code>即为解密结果</li>
</ul>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">aesCBCDecrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">encryptData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> aes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	blockSize </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">BlockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">encryptData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain"> blockSize </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> errors</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"ciphertext too short"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	iv </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> encryptData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	encryptData </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> encryptData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">blockSize</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// CBC mode always works in whole blocks.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">encryptData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:rgb(137, 221, 255)">%</span><span class="token plain">blockSize </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> errors</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"ciphertext is not a multiple of the block size"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	mode </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> cipher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewCBCDecrypter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> iv</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// CryptBlocks can work in-place if the two arguments are the same.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	mode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">CryptBlocks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">encryptData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> encryptData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">//解填充</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	encryptData </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">pkcs7UnPadding</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">encryptData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> encryptData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>这里要注意的是，解密的结果并不一定是我们原来的加密数据，可能还含有补位，一定要把补位去掉才是原来的数据</p>
<p>特点：</p>
<ul>
<li class="">不容易主动攻击,安全性好于<code>ECB</code>,适合传输长度长的报文,是<code>SSL</code>、<code>IPSec</code>的标准。每个密文块依赖于所有的信息块, 明文消息中一个改变会影响所有密文块</li>
<li class="">发送方和接收方都需要知道初始化向量</li>
<li class="">加密过程是串行的，无法被并行化（在解密时，从两个邻接的密文块中即可得到一个平文块。因此，解密过程可以被并行化）</li>
</ul>
<p>See you ~</p>]]></content:encoded>
            <category>Golang</category>
        </item>
        <item>
            <title><![CDATA[Golang与散列算法]]></title>
            <link>https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/</link>
            <guid>https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/</guid>
            <pubDate>Fri, 17 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[golang]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="golang" src="https://www.ssgeek.com/assets/images/golang-750d8e6c343698d59ca6f2fe5d2317d9.png" width="2052" height="1364" class="img_ev3q"></p>
<p>散列是信息的提炼，通常其长度要比信息小得多，且为一个固定长度。加密性强的散列一定是不可逆的，这就意味着通过散列结果，无法推出任何部分的原始信息。任何输入信息的变化，哪怕仅一位，都将导致散列结果的明显变化，这称之为雪崩效应。散列还应该是防冲突的，即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。常用于保证数据完整性</p>
<p>单向散列函数一般用于产生消息摘要，密钥加密等，常见的有</p>
<ul>
<li class="">MD5(Message Digest Algorithm 5)：是<code>RSA</code>数据安全公司开发的一种单向散列算法</li>
<li class="">SHA(Secure Hash Algorithm)：可以对任意长度的数据运算生成一个<code>160</code>位的数值</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="哈希函数的基本特征">哈希函数的基本特征<a href="https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/#%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%89%B9%E5%BE%81" class="hash-link" aria-label="哈希函数的基本特征的直接链接" title="哈希函数的基本特征的直接链接" translate="no">​</a></h2>
<p>哈希函数不是加密算法，其特征为单向性和唯一性</p>
<p>具体如下</p>
<ul>
<li class="">输入可以是任意长度</li>
<li class="">输出是固定长度</li>
<li class="">根据输入很容易计算出输出</li>
<li class="">根据输出很难计算出输入（几乎不可能）</li>
<li class="">两个不同的输入几乎不可能得到相同的输出</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="sha-1">SHA-1<a href="https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/#sha-1" class="hash-link" aria-label="SHA-1的直接链接" title="SHA-1的直接链接" translate="no">​</a></h2>
<blockquote>
<p><a href="https://golang.google.cn/pkg/crypto/sha1/" target="_blank" rel="noopener noreferrer" class="">https://golang.google.cn/pkg/crypto/sha1/</a></p>
</blockquote>
<p>在<code>1993</code>年，安全散列算法（SHA）由美国国家标准和技术协会(NIST)提出，并作为联邦信息处理标准（FIPS PUB 180）公布；<code>1995</code>年又发布了一个修订版<code>FIPS PUB 180-1</code>，通常称之为<code>SHA-1</code>。<code>SHA-1</code>是基于<code>MD4</code>算法的，并且它的设计在很大程度上是模仿<code>MD4</code>的。现在已成为公认的最安全的散列算法之一，并被广泛使用</p>
<p><code>SHA-1</code>是一种数据加密算法，该算法的思想是接收一段明文，然后以一种不可逆的方式将它转换成一段（通常更小）密文，也可以简单的理解为取一串输入码（称为预映射或信息），并把它们转化为长度较短、位数固定的输出序列即散列值（也称为信息摘要或信息认证代码）的过程
该算法输入报文的最大长度不超过<code>264</code>位，产生的输出是一个<code>160</code>位的报文摘要。输入是按<code>512</code>位的分组进行处理的。<code>SHA-1</code>是不可逆的、防冲突，并具有良好的雪崩效应</p>
<p><code>sha1</code>是<code>SHA</code>家族的五个算法之一(其它四个是<code>SHA-224</code>、<code>SHA-256</code>、<code>SHA-384</code>，和<code>SHA-512</code>)</p>
<p><code>SHA（Secure Hash Algorithm）</code>安全散列算法，是一系列密码散列函数，有多个不同安全等级的版本：<code>SHA-1，SHA-224，SHA-256，SHA-384，SHA-512</code></p>
<p>防伪装，防窜扰，保证信息的合法性和完整性</p>
<p>算法流程：</p>
<ul>
<li class="">
<p>填充，使得数据长度对<code>512</code>求余的结果为<code>448</code></p>
</li>
<li class="">
<p>在信息摘要后面附加<code>64bit</code>，表示原始信息摘要的长度</p>
</li>
<li class="">
<p>初始化<code>h0</code>到<code>h4</code>，每个<code>h</code>都是<code>32</code>位</p>
</li>
<li class="">
<p><code>h0</code>到<code>h4</code>历经<code>80</code>轮复杂的变换</p>
</li>
<li class="">
<p>把<code>h0</code>到<code>h4</code>拼接起来，构成<code>160</code>位，返回</p>
</li>
</ul>
<p>常用函数</p>
<ul>
<li class="">New：创建Hash对象用于计算字节/字符<code>sha1</code>值</li>
<li class="">Sum：计算字节切片<code>sha1</code>值</li>
</ul>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/sha1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	data </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"This page intentionally left blank."</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"%x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p><code>sha256</code>、<code>sha512</code>同理</p>
<p>使用示例</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/sha1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"io"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// sha1散列算法</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">sha1Hash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">msg </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">hashData </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	h </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	io</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">WriteString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">h</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	hashData </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> h</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	msg </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"This is the message to hash!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// sha1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	sha1Data </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">sha1Hash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"SHA1: %x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> sha1Data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="md5">MD5<a href="https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/#md5" class="hash-link" aria-label="MD5的直接链接" title="MD5的直接链接" translate="no">​</a></h2>
<blockquote>
<p><a href="https://golang.google.cn/pkg/crypto/md5/" target="_blank" rel="noopener noreferrer" class="">https://golang.google.cn/pkg/crypto/md5/</a></p>
</blockquote>
<p><code>MD5</code>即<code>Message-Digest Algorithm 5</code>（信息-摘要算法5），用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一（又译摘要算法、哈希算法），主流编程语言普遍已有<code>MD5</code>实现。将数据（如汉字）运算为另一固定长度值，是杂凑算法的基础原理，<code>MD5</code>的前身有<code>MD2</code>、<code>MD3</code>和<code>MD4</code></p>
<ul>
<li class="">
<p>算法流程跟<code>SHA-1</code>大体相似</p>
</li>
<li class="">
<p><code>MD5</code>的输出是<code>128</code>位，比<code>SHA-1</code>短了<code>32</code>位</p>
</li>
<li class="">
<p><code>MD5</code>相对易受密码分析的攻击，运算速度比<code>SHA-1</code>快</p>
</li>
</ul>
<p>常用函数</p>
<ul>
<li class="">
<p>New：创建<code>Hash</code>对象用于计算字节/字符<code>md5</code>值</p>
</li>
<li class="">
<p>Sum：计算字节切片<code>md5</code>值</p>
</li>
</ul>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/md5"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 最基础的使用方式: Sum 返回数据的MD5校验和</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"%x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> md5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"测试数据"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="基本使用-直接计算">基本使用-直接计算<a href="https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/#%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8-%E7%9B%B4%E6%8E%A5%E8%AE%A1%E7%AE%97" class="hash-link" aria-label="基本使用-直接计算的直接链接" title="基本使用-直接计算的直接链接" translate="no">​</a></h3>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/md5"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"encoding/hex"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 结果是byte类型的数组</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	bytes </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> md5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"i am geek"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 转换为32位小写</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"%x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 397f77c74db1e25084653531a8046f21</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 转换为字符串</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	x </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sprintf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"%x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Println</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 397f77c74db1e25084653531a8046f21</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Println</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">hex</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">EncodeToString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 397f77c74db1e25084653531a8046f21</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="大量数据-散列计算">大量数据-散列计算<a href="https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/#%E5%A4%A7%E9%87%8F%E6%95%B0%E6%8D%AE-%E6%95%A3%E5%88%97%E8%AE%A1%E7%AE%97" class="hash-link" aria-label="大量数据-散列计算的直接链接" title="大量数据-散列计算的直接链接" translate="no">​</a></h3>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/md5"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 较大时，分开批量计算</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	m </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> md5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	m</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Write</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"i am"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	m</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Write</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">" geek"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"%x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 397f77c74db1e25084653531a8046f21</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="sha-1与md5的比较">SHA-1与MD5的比较<a href="https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/#sha-1%E4%B8%8Emd5%E7%9A%84%E6%AF%94%E8%BE%83" class="hash-link" aria-label="SHA-1与MD5的比较的直接链接" title="SHA-1与MD5的比较的直接链接" translate="no">​</a></h2>
<p>因为二者均由<code>MD4</code>导出，<code>SHA-1</code>和<code>MD5</code>彼此很相似。相应的，他们的强度和其他特性也是相似，但还有以下几点不同：</p>
<ul>
<li class="">对强行供给的安全性：最显著和最重要的区别是<code>SHA-1</code>摘要比<code>MD5</code>摘要长<code>32</code>位。使用强行技术，产生任何一个报文使其摘要等于给定报摘要的难度对<code>MD5</code>是<code>2128</code>数量级的操作，而对<code>SHA-1</code>则是<code>2160</code>数量级的操作。这样，<code>SHA-1</code>对强行攻击有更大的强度。</li>
<li class="">对密码分析的安全性：由于<code>MD5</code>的设计，易受密码分析的攻击，<code>SHA-1</code>显得不易受这样的攻击。</li>
<li class="">速度：在相同的硬件上，<code>SHA-1</code>的运行速度比<code>MD5</code>慢</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="hmac">Hmac<a href="https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/#hmac" class="hash-link" aria-label="Hmac的直接链接" title="Hmac的直接链接" translate="no">​</a></h2>
<blockquote>
<p><a href="https://golang.google.cn/pkg/crypto/hmac/" target="_blank" rel="noopener noreferrer" class="">https://golang.google.cn/pkg/crypto/hmac/</a></p>
</blockquote>
<p><code>Hmac</code>算法也是一种哈希算法，它可以利用<code>MD5</code>或<code>SHA1</code>等哈希算法。不同的是，<code>Hmac</code>还需要一个密钥, 只要密钥发生了变化，那么同样的输入数据也会得到不同的签名，因此，可以把<code>Hmac</code>理解为用随机数“增强”的哈希算法</p>
<p>常用函数</p>
<ul>
<li class="">New：创建<code>Hash</code>对象用于计算字节/字符<code>hmac</code>值</li>
<li class="">Equal：比较<code>hmac</code>值是否相等</li>
</ul>
<p><code>Hs256</code>实现</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/hmac"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/sha256"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"io"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	key </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"1234567890abcdefg"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 创建hmac hash对象</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	hash </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> hmac</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">sha256</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 写入字符串计算散列</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	io</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">WriteString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">hash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"hi,geek"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 计算hmac散列</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"%x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> hash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 89fda53d5e71e8c87adb15f8bf11c2c931af019a5c040321e243b82a3bb45ee5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	hash2 </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> hmac</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">sha256</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	hash2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Write</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"hi,geek"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Println</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">hmac</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Equal</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">hash2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> hash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>使用示例</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/hmac"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"io"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 使用sha1的Hmac散列算法</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">hmacHash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">msg </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> key </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">hashData </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	k </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	mac </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> hmac</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> k</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	io</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">WriteString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">mac</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	hashData </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> mac</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	msg </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"This is the message to hash!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// hmac</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	hmacData </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">hmacHash</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"The key string!"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"HMAC: %x\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> hmacData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="哈希函数的应用">哈希函数的应用<a href="https://www.ssgeek.com/blog/golang-yu-san-lie-suan-fa/#%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0%E7%9A%84%E5%BA%94%E7%94%A8" class="hash-link" aria-label="哈希函数的��应用的直接链接" title="哈希函数的应用的直接链接" translate="no">​</a></h2>
<ul>
<li class="">
<p>用户密码的存储</p>
</li>
<li class="">
<p>文件上传/下载完整性校验</p>
</li>
<li class="">
<p>mysql大字段的快速对比</p>
</li>
<li class="">
<p>数字签名（区块链，比特币）</p>
</li>
</ul>
<p>示例代码</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/md5"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"crypto/sha1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"encoding/hex"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token string" style="color:rgb(195, 232, 141)">"fmt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">Sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">data </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	sha1 </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Write</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> hex</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">EncodeToString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">Md5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">data </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	md5 </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> md5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">New</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	md5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Write</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> hex</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">EncodeToString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">md5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Sum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	data </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"abcdefg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"SHA-1: %s\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">Sha1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Printf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"MD5: %s\n"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">Md5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>一个实际的例子，用户名密码校验</p>
<p>密码校验则是一个很常见的问题, 当我们设计用户中心时，是一个必不可少的功能, 为了安全，我们都不会保存用户的明文密码, 最好的方式就是保存为<code>Hash</code>, 这样即使是数据泄露了，也不会导致用户的明文密码泄露(<code>hash</code>的过程是不可逆的)</p>
<p>示例需求如下</p>
<ul>
<li class="">能校验密码</li>
</ul>
<ul>
<li class="">用户可以修改密码</li>
<li class="">修改密码时，禁止使用最近已经使用过的密码</li>
</ul>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// NewHashedPassword 生产hash后的密码对象</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">NewHashedPassword</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">password </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> bcrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">GenerateFromPassword</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		CreateAt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ftime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Now</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Timestamp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		UpdateAt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ftime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Now</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Timestamp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">type</span><span class="token plain"> Password </span><span class="token keyword" style="font-style:italic">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// hash过后的密码</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	Password </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 密码创建时间</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	CreateAt </span><span class="token builtin" style="color:rgb(130, 170, 255)">int64</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 密码更新时间</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	UpdateAt </span><span class="token builtin" style="color:rgb(130, 170, 255)">int64</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 密码需要被重置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	NeedReset </span><span class="token builtin" style="color:rgb(130, 170, 255)">bool</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 需要重置的原因</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	ResetReason </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 历史密码</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	History </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// 是否过期</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	IsExpired </span><span class="token builtin" style="color:rgb(130, 170, 255)">bool</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// Update 更新密码</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">Update</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token builtin" style="color:rgb(130, 170, 255)">new</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> maxHistory </span><span class="token builtin" style="color:rgb(130, 170, 255)">uint</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> needReset </span><span class="token builtin" style="color:rgb(130, 170, 255)">bool</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">rotaryHistory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">maxHistory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Password </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">new</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Password</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">NeedReset </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> needReset</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">UpdateAt </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> ftime</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Now</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Timestamp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">!</span><span class="token plain">needReset </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">ResetReason </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// IsHistory 检测是否是历史密码</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">IsHistory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">password </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">bool</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">for</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">_</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> pass </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">range</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">History </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> bcrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">CompareHashAndPassword</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">pass</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">==</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">			</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// HistoryCount 保存了几个历史密码</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">HistoryCount</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">int</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">History</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">rotaryHistory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">maxHistory </span><span class="token builtin" style="color:rgb(130, 170, 255)">uint</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">uint</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">HistoryCount</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain"> maxHistory </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">History </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">append</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">History</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		remainHistry </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">History</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">maxHistory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">History </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">History </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">append</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">History</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> remainHistry</span><span class="token operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">// CheckPassword 判断password 是否正确</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">func</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">CheckPassword</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">password </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	err </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> bcrypt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">CompareHashAndPassword</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token function" style="color:rgb(130, 170, 255)">byte</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(137, 221, 255)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> exception</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">NewUnauthorized</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"user or password not connrect"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Golang</category>
        </item>
    </channel>
</rss>