From ba6fe7d9ffeebf70e5988d98ca21920f08c76d04 Mon Sep 17 00:00:00 2001 From: weic Date: Thu, 18 Apr 2024 09:59:11 +0800 Subject: [PATCH] 1 --- docs/study/encryption/ASN.1.md | 13 + docs/study/encryption/index.md | 79 ++--- ...06\347\240\201\347\256\227\346\263\225.md" | 117 ++++---- ...60\345\255\227\350\257\201\344\271\246.md" | 20 ++ ...15\347\247\260\347\274\251\345\206\231.md" | 8 + docs/study/program/Golang/index.md | 282 ++++++++++-------- ...50\347\232\204\345\267\245\345\205\267.md" | 5 + 7 files changed, 299 insertions(+), 225 deletions(-) create mode 100644 docs/study/encryption/ASN.1.md create mode 100644 "docs/study/encryption/\346\225\260\345\255\227\350\257\201\344\271\246.md" create mode 100644 "docs/study/other/\346\240\207\345\207\206\345\220\215\347\247\260\347\274\251\345\206\231.md" create mode 100644 "docs/study/program/Golang/\345\270\270\347\224\250\347\232\204\345\267\245\345\205\267.md" diff --git a/docs/study/encryption/ASN.1.md b/docs/study/encryption/ASN.1.md new file mode 100644 index 000000000..d27a63c6e --- /dev/null +++ b/docs/study/encryption/ASN.1.md @@ -0,0 +1,13 @@ +# ASN.1 + +抽象语法标记、 + +包含编码规则,如下 + +ASN.1 取得成功的一个主要原因是它与几个标准化编码规则相关,如基本编码规则(BER) -X.209 、规范编码规则(CER)、识别名编码规则(DER)、压缩编码规则(PER)和 XML编码规则(XER)。这些编码规则描述了如何对 ASN.1 中定义的数值进行编码,以便用于传输,而不管计算机、编程语言或它在应用程序中如何表示等因素。ASN.1 的编码方法比许多与之相竞争的标记系统更先进,它支持可扩展信息快速可靠的传输 — 在无线宽带中,这是一种优势。1984年,ASN.1 就已经成为了一种国际标准,它的编码规则已经成熟并在可靠性和兼容性方面拥有更丰富的历程。 + +简洁的二进制编码规则(BER、CER、DER、PER,但不包括 XER)可当作更现代 XML 的替代。然而,ASN.1 支持对数据的语义进行描述,所以它是比 XML 更为高级的语言。 + +### 参考 + +- [百度百科](https://baike.baidu.com/item/ASN.1/498523?fr=ge_ala) \ No newline at end of file diff --git a/docs/study/encryption/index.md b/docs/study/encryption/index.md index a0a6e9d40..f20da11f1 100644 --- a/docs/study/encryption/index.md +++ b/docs/study/encryption/index.md @@ -1,39 +1,40 @@ -# 加解密 - -### 加密和解密 - -加密是以某种特定的算法,改变原有的数据信息,使得未授权的用户即使获得了加密后的数据,但因不知解密的方法(确切的说是不知道密钥),仍然无法了解其信息内容。而解密则是加密的逆过程。 - -### 明文和密文 - -我们称尚未加密的数据为明文,通过固定算法加密后的数据为密文。 - -### 加密的密钥 - -密钥是一种参数,它是在明文转换为密文或密文转换为明文时算法的输入参数。可以理解成密码的钥匙。 - -### 对称与非对称 - -#### 对称加密 - -对称加密算法中,数据发送方将明文和密钥一起经过特殊加密算法处理成密文后,将它发送出去。接收方收到密文后,若想解读原文,则需要使用加密用到的相同密钥及相同算法的逆算法对密文进行解密,才能使其恢复成原文。 - -它的最大优势是加/解密速度快,适用于大数据量进行加密,缺点是密钥管理困难,最典型的问题就是如何同步这个密钥,同步过程如果在公网上,不进行加密是可以抓包拿到的,那么这里就遇到了要对密钥加密的问题。 - -常见的对称加密算法有 AES、DES、Blowfish 等等。 - -对称加密的核心是只有一把密钥。 - -#### 非对称加密 - -非对称加密算法中,有两个密钥:公钥和私钥。它们是一对,如果用公钥进行加密,只有用对应的私钥才能解密;如果用私钥进行加密,只有用对应的公钥才能解密。 - -非对称加密算法实现机密信息的交换过程为:甲方生成一对密钥并将其中一个作为公钥向其他方公开;得到该公钥的乙方使用该密钥对机密信息进行加密后发送给甲方;甲方再用自己的另一个专用密钥对加密后的信息进行解密。 - -最有名的非对称加密算法当属 RSA 了,本文将对 RSA 算法的加/解密过程进行详细剖析。 - -非对称加密拥有两把密钥。 - -### 参考 - -- [WIKI-彩虹表](https://zh.wikipedia.org/wiki/%E5%BD%A9%E8%99%B9%E8%A1%A8) +# 加解密 + +### 加密和解密 + +加密是以某种特定的算法,改变原有的数据信息,使得未授权的用户即使获得了加密后的数据,但因不知解密的方法(确切的说是不知道密钥),仍然无法了解其信息内容。而解密则是加密的逆过程。 + +### 明文和密文 + +我们称尚未加密的数据为明文,通过固定算法加密后的数据为密文。 + +### 加密的密钥 + +密钥是一种参数,它是在明文转换为密文或密文转换为明文时算法的输入参数。可以理解成密码的钥匙。 + +### 对称与非对称 + +#### 对称加密 + +对称加密算法中,数据发送方将明文和密钥一起经过特殊加密算法处理成密文后,将它发送出去。接收方收到密文后,若想解读原文,则需要使用加密用到的相同密钥及相同算法的逆算法对密文进行解密,才能使其恢复成原文。 + +它的最大优势是加/解密速度快,适用于大数据量进行加密,缺点是密钥管理困难,最典型的问题就是如何同步这个密钥,同步过程如果在公网上,不进行加密是可以抓包拿到的,那么这里就遇到了要对密钥加密的问题。 + +常见的对称加密算法有 AES、DES、Blowfish 等等。 + +对称加密的核心是只有一把密钥。 + +#### 非对称加密 + +非对称加密算法中,有两个密钥:公钥和私钥。它们是一对,如果用公钥进行加密,只有用对应的私钥才能解密;如果用私钥进行加密,只有用对应的公钥才能解密。 + +非对称加密算法实现机密信息的交换过程为:甲方生成一对密钥并将其中一个作为公钥向其他方公开;得到该公钥的乙方使用该密钥对机密信息进行加密后发送给甲方;甲方再用自己的另一个专用密钥对加密后的信息进行解密。 + +最有名的非对称加密算法当属 RSA 了,本文将对 RSA 算法的加/解密过程进行详细剖析。 + +非对称加密拥有两把密钥。 + +### 参考 + +- [WIKI-彩虹表](https://zh.wikipedia.org/wiki/%E5%BD%A9%E8%99%B9%E8%A1%A8) +- [http://gmssl.org/](http://gmssl.org/) diff --git "a/docs/study/encryption/\344\270\255\345\233\275\345\225\206\347\224\250\345\257\206\347\240\201\347\256\227\346\263\225.md" "b/docs/study/encryption/\344\270\255\345\233\275\345\225\206\347\224\250\345\257\206\347\240\201\347\256\227\346\263\225.md" index bff5a3071..3ec6f9bb9 100644 --- "a/docs/study/encryption/\344\270\255\345\233\275\345\225\206\347\224\250\345\257\206\347\240\201\347\256\227\346\263\225.md" +++ "b/docs/study/encryption/\344\270\255\345\233\275\345\225\206\347\224\250\345\257\206\347\240\201\347\256\227\346\263\225.md" @@ -1,58 +1,59 @@ -### 简介 - -商用密码技术,是指能够实现商用密码算法的加密、解密和认证等功能的技术。(包括密码算法编程技术和密码算法芯片、加密卡等的实现技术)。商用密码技术是商用密码的核心,国家将商用密码技术列入国家秘密,任何单位和个人都有责任和义务保护商用密码技术的秘密。 - -商用密码的应用领域十分广泛,主要用于对不涉及国家秘密内容但又具有敏感性的内部信息、行政事务信息、经济信息等进行加密保护。比如:商用密码可用于企业内部的各类敏感信息的传输加密、存储加密,防止非法第三方获取信息内容;也可用于各种安全认证、网上银行、数字签名等。 - -对称密码又可分为分组密码和序列(流)密码 - -SM4 算法是 SM 系列算法中使用最为广泛的密码算法。 - -### SM1 商密 1 号 - -- 对称加密,分组加密 -- 亦称 SCB2 算法 -- **_不公开_**,仅以 IP 核的形式存在于芯片中 -- 采用该算法已经研制了系列芯片、智能 IC 卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。 -- 替换 AES,分组长度和密钥长度都为 128 比特 - -### SM2 - -- 公钥加密,基于椭圆曲线 -- 替换 RSA -- **_公开_** [国家密码管理局-该算法文档](https://sca.gov.cn/sca/xwdt/2010-12/17/content_1002386.shtml) -- 目前支持 SM2 算法的产品已达 1000 余款,广泛应用于电子政务、移动办公、电子商务、移动支付、电子证书等基础设施、云服务等领域。 - -### SM3 - -- 哈希算法 -- **_公开_**,[国家密码管理局-该算法文档](https://sca.gov.cn/sca/xwdt/2010-12/17/content_1002389.shtml) -- 该算法已成为我国电子签名类密码系统、计算机安全登录系统、计算机安全通信系统、数字证书、 网络安全基础设施、安全云计算平台与大数据等领域信息安全的基础技术。 - -### SMS4 - -- 对称加密 -- **_公开_** [国家密码管理局-该算法文档](http://www.sca.gov.cn/sca/c100061/201611/1002423/files/330480f731f64e1ea75138211ea0dc27.pdf) - -SMS4 算法,是一个分组算法,分组长度和密钥长度均为 128 比特,加密算法与密钥扩展算法都采用 32 轮非线性迭代结构,最初作为无线局域网专用密码算法发布,后成为分组密码算法行业标准。目前支持 SMS4 算法的产品已达 700 余款,覆盖了各种有对称加密需求的应用。由于 SMS4 算法最初用于无线局域网芯片 WAPI 协议中,支持 SMS4 算法的 WAPI 无线局域网芯片已超过 350 多个型号,全球累计出 货量超过 70 亿颗。在金融领域,仅统计支持 SMS4 算法的智能密码钥匙出货量已超过 1.5 亿支。此外,SMS4 算法已被纳人可信计算组织(TCG)发布的可信平台模块库规范(TPIM2.0)中。 - -### SM7 - -- 对称加密 -- **_不公开_** - -SM7 适用于非接触式 IC 卡,应用包括身份识别类应用(门禁卡、工作证、参赛证),票务类应用(大型赛事门票、展会门票),支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通等)。 - -### SM9 - -- 标识密码算法 -- **_公开_** -- SM9 是一种基于身份标识的公钥密码算法,也被称为标识密码,采用 256 比特的椭圆曲线。 - -SM9 算法不需要申请数字证书,适用于互联网应用的各种新兴应用的安全保密保障,如基于云技术的密码服务、电子邮件安全、智能终端保护、物联网安全、云存储安全等等。 - -### 祖冲&ZUC 算法 - -- 流密码 -- 主要用于通信领域 -- 该算法速度快,常用于移动通信 4G 网络。 +### 简介 + +商用密码技术,是指能够实现商用密码算法的加密、解密和认证等功能的技术。(包括密码算法编程技术和密码算法芯片、加密卡等的实现技术)。商用密码技术是商用密码的核心,国家将商用密码技术列入国家秘密,任何单位和个人都有责任和义务保护商用密码技术的秘密。 + +商用密码的应用领域十分广泛,主要用于对不涉及国家秘密内容但又具有敏感性的内部信息、行政事务信息、经济信息等进行加密保护。比如:商用密码可用于企业内部的各类敏感信息的传输加密、存储加密,防止非法第三方获取信息内容;也可用于各种安全认证、网上银行、数字签名等。 + +对称密码又可分为分组密码和序列(流)密码 + +SM4 算法是 SM 系列算法中使用最为广泛的密码算法。 + +### SM1 商密 1 号 + +- 对称加密,分组加密 +- 亦称 SCB2 算法 +- **_不公开_**,仅以 IP 核的形式存在于芯片中 +- 采用该算法已经研制了系列芯片、智能 IC 卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。 +- 替换 AES,分组长度和密钥长度都为 128 比特 + +### SM2 + +- 公钥加密,基于椭圆曲线 +- 替换 RSA +- **_公开_** [国家密码管理局-该算法文档](https://sca.gov.cn/sca/xwdt/2010-12/17/content_1002386.shtml) +- 目前支持 SM2 算法的产品已达 1000 余款,广泛应用于电子政务、移动办公、电子商务、移动支付、电子证书等基础设施、云服务等领域。 +- SM2默认曲线算法 sm2p256v1 + +### SM3 + +- 哈希算法 +- **_公开_**,[国家密码管理局-该算法文档](https://sca.gov.cn/sca/xwdt/2010-12/17/content_1002389.shtml) +- 该算法已成为我国电子签名类密码系统、计算机安全登录系统、计算机安全通信系统、数字证书、 网络安全基础设施、安全云计算平台与大数据等领域信息安全的基础技术。 + +### SMS4 + +- 对称加密 +- **_公开_** [国家密码管理局-该算法文档](http://www.sca.gov.cn/sca/c100061/201611/1002423/files/330480f731f64e1ea75138211ea0dc27.pdf) + +SMS4 算法,是一个分组算法,分组长度和密钥长度均为 128 比特,加密算法与密钥扩展算法都采用 32 轮非线性迭代结构,最初作为无线局域网专用密码算法发布,后成为分组密码算法行业标准。目前支持 SMS4 算法的产品已达 700 余款,覆盖了各种有对称加密需求的应用。由于 SMS4 算法最初用于无线局域网芯片 WAPI 协议中,支持 SMS4 算法的 WAPI 无线局域网芯片已超过 350 多个型号,全球累计出 货量超过 70 亿颗。在金融领域,仅统计支持 SMS4 算法的智能密码钥匙出货量已超过 1.5 亿支。此外,SMS4 算法已被纳人可信计算组织(TCG)发布的可信平台模块库规范(TPIM2.0)中。 + +### SM7 + +- 对称加密 +- **_不公开_** + +SM7 适用于非接触式 IC 卡,应用包括身份识别类应用(门禁卡、工作证、参赛证),票务类应用(大型赛事门票、展会门票),支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通等)。 + +### SM9 + +- 标识密码算法 +- **_公开_** +- SM9 是一种基于身份标识的公钥密码算法,也被称为标识密码,采用 256 比特的椭圆曲线。 + +SM9 算法不需要申请数字证书,适用于互联网应用的各种新兴应用的安全保密保障,如基于云技术的密码服务、电子邮件安全、智能终端保护、物联网安全、云存储安全等等。 + +### 祖冲&ZUC 算法 + +- 流密码 +- 主要用于通信领域 +- 该算法速度快,常用于移动通信 4G 网络。 diff --git "a/docs/study/encryption/\346\225\260\345\255\227\350\257\201\344\271\246.md" "b/docs/study/encryption/\346\225\260\345\255\227\350\257\201\344\271\246.md" new file mode 100644 index 000000000..b4294f5d8 --- /dev/null +++ "b/docs/study/encryption/\346\225\260\345\255\227\350\257\201\344\271\246.md" @@ -0,0 +1,20 @@ +数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名)。它是由权威机构——CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。 + + + +### pfx证书转pem和key + +要将PFX格式的证书转换为PEM格式,并且提取出私钥,可以使用OpenSSL工具。 + +```shell +# 执行以下命令将PFX证书转换为PEM格式: +openssl pkcs12 -in your_certificate.pfx -nodes -out certificate.pem +# 执行以下命令从PEM文件中提取私钥: +openssl rsa -in certificate.pem -out private_key.key +``` + + +### 参考 + +- [博客园-常见数字证书类型](https://www.cnblogs.com/xq1314/p/7987216.html) +- [博客园-openssl实现公私钥证书生成及转换](https://www.cnblogs.com/xq1314/p/8080598.html) \ No newline at end of file diff --git "a/docs/study/other/\346\240\207\345\207\206\345\220\215\347\247\260\347\274\251\345\206\231.md" "b/docs/study/other/\346\240\207\345\207\206\345\220\215\347\247\260\347\274\251\345\206\231.md" new file mode 100644 index 000000000..92251ebf9 --- /dev/null +++ "b/docs/study/other/\346\240\207\345\207\206\345\220\215\347\247\260\347\274\251\345\206\231.md" @@ -0,0 +1,8 @@ +### 国内标准 + + +- GB/T:中国的国家的推荐标准,国标 +- GM/T:中国密码行业的推荐标准,国密 +- GA/T:中国公共安全行业的推荐标准,国安 + +[中华人民共和国密码行业标准(GM/T)文本](https://github.com/guanzhi/GM-Standards) \ No newline at end of file diff --git a/docs/study/program/Golang/index.md b/docs/study/program/Golang/index.md index ee670db69..d3f5a2215 100644 --- a/docs/study/program/Golang/index.md +++ b/docs/study/program/Golang/index.md @@ -1,128 +1,154 @@ -# Golang - -### Go 语言设计初衷 - -为了解决当时 Google 开发遇到的问题: - -1. 编译慢; -2. 大量的 C++代码,同时又引入了 Java 和 Python; -3. 更新的花费越来越长; -4. 分布式的编译系统; -5. 数百万的服务器; - -### Go 语言的特色 - -1. 高效的并发编程([基于 CSP](https://zh.wikipedia.org/wiki/%E9%80%9A%E4%BF%A1%E9%A1%BA%E5%BA%8F%E8%BF%9B%E7%A8%8B)); -2. 内存回收(GC); -3. 编译速度快; -4. 函数多返回值; -5. 语言交互性; -6. 没有异常处理(Error is value); - -### Go 语言的优势 - -1. 学习曲线容易; -2. 效率:快速的编译时间,开发效率和运行效率高; -3. 出身名门,血统纯正; -4. 并行和异步编程几乎没有痛点; -5. 自由高效:组合的思想、无侵入式的接口、强大的标准库、部署方便、稳定性; - -### 我们为什么选择 Go 语言 - -1. 执行性能 -2. 开发效率 - -### Go 语言能做什么 - -1. 服务器编程; -2. 分布式系统、数据库代理器、中间件等; -3. 网络编程; -4. 数据库操作; -5. 开发云平台; - -### 信息 - -- 官网:https://golang.google.cn/ -- API 文档:https://golang.google.cn/doc/ -- 教程:http://www.w3cschool.cn/go/go-tutorial.html -- 下载:https://golang.google.cn/dl/ -- 标准库:https://pkg.go.dev/std -- [Go 语言设计与实现](https://draveness.me/golang/) - - 重点是设计原理 挺底层的 -- [李文周-Go 语言学习之路/Go 语言教程](https://www.liwenzhou.com/posts/Go/golang-menu/) - - [fmt 格式化语法](https://www.liwenzhou.com/posts/Go/fmt/) - -### GC - -- [知乎-Golang 内存管理之 GC](https://zhuanlan.zhihu.com/p/593008674?utm_id=0) - -### 安全编译 - -在Go语言中,“安全编译”可能指的是使用安全的编译参数,以确保代码的安全性和性能最优。这通常涉及到使用编译器的各种安全和性能参数,比如: - -使用 -s 或 -w 参数来减少编译后的二进制文件大小,去掉调试信息和符号信息。 - -使用 -ldflags 来设置链接器的标志,比如 -s -w 来进一步优化编译结果。 - -使用 -buildmode 参数来指定编译模式,比如 pie 来生成位置无关的可执行文件,增加安全性。 - -下面是一个简单的例子,演示如何使用 -ldflags 来优化编译结果: - -go build -ldflags "-s -w" -o myapp . - -这条命令会编译当前目录下的Go代码,并输出一个没有调试信息、符号和优化过的、体积更小的可执行文件 myapp。 - -如果你想进一步确保安全性,可以使用Go的安全性标志,比如 -tags safe,这取决于你使用的第三方库是否支持这个tag。 - -go build -tags safe -o myapp . - -请注意,每个项目可能有特定的安全和性能要求,因此编译参数应根据具体情况选择和调整。 - -```shell -# -go build -ldflags "-s -w -buildmode=pie -linkmode external -extldflags=-Wl,-z,relro,-z,now" -o CcspUtilRemote-`uname -m` -# -go build -tags safe -o myapp . -# 使用此命令查看 -go tool link --help -``` - -实际问题例子: - -```shell -# 安全编译检查 出现两个问题 [STACK CANARY/FORTIFY] -checksec --file=./xxx-x86_64 -# 处理[STACK CANARY/FORTIFY] 增加CGO 以及CGO代码文件cgo_safe.go -CGO_ENABLED=1 CGO_CFLAGS="-fstack-protector-all -D_FORTIFY_SOURCE=2 -O" go build -ldflags "-s -w -buildmode=pie -linkmode external -extldflags=-Wl,-z,relro,-z,now" -o xxx-`uname -m` -``` - -cgo_safe.go - -```go -package main - -import "C" -import "fmt" - -func init() { - s := C.CString("hello") - fmt.Println(s) - -} - -``` - -### 跨平台编译 - -具体操作 - -编译跨平台的只需要修改GOOS、GOARCH、CGO_ENABLED三个环境变量即可 - -- GOOS:目标平台的操作系统(darwin、freebsd、linux、windows) -- GOARCH:目标平台的体系架构32位还是64位(386、amd64、arm) -- 交叉编译不支持 CGO 所以要禁用它 - -### CGO - -- [CGO:让Go程序调用C函数的神器](https://blog.csdn.net/qq_42538588/article/details/131167683) -- [go语言调用c语言动态库及交叉编译](https://blog.csdn.net/weixin_43128854/article/details/122956384) \ No newline at end of file +# Golang + +### Go 语言设计初衷 + +为了解决当时 Google 开发遇到的问题: + +1. 编译慢; +2. 大量的 C++代码,同时又引入了 Java 和 Python; +3. 更新的花费越来越长; +4. 分布式的编译系统; +5. 数百万的服务器; + +### Go 语言的特色 + +1. 高效的并发编程([基于 CSP](https://zh.wikipedia.org/wiki/%E9%80%9A%E4%BF%A1%E9%A1%BA%E5%BA%8F%E8%BF%9B%E7%A8%8B)); +2. 内存回收(GC); +3. 编译速度快; +4. 函数多返回值; +5. 语言交互性; +6. 没有异常处理(Error is value); + +### Go 语言的优势 + +1. 学习曲线容易; +2. 效率:快速的编译时间,开发效率和运行效率高; +3. 出身名门,血统纯正; +4. 并行和异步编程几乎没有痛点; +5. 自由高效:组合的思想、无侵入式的接口、强大的标准库、部署方便、稳定性; + +### 我们为什么选择 Go 语言 + +1. 执行性能 +2. 开发效率 + +### Go 语言能做什么 + +1. 服务器编程; +2. 分布式系统、数据库代理器、中间件等; +3. 网络编程; +4. 数据库操作; +5. 开发云平台; + +### 信息 + +- 官网:https://golang.google.cn/ +- API 文档:https://golang.google.cn/doc/ +- 教程:http://www.w3cschool.cn/go/go-tutorial.html +- 下载:https://golang.google.cn/dl/ +- 标准库:https://pkg.go.dev/std +- [Go 语言设计与实现](https://draveness.me/golang/) + - 重点是设计原理 挺底层的 +- [李文周-Go 语言学习之路/Go 语言教程](https://www.liwenzhou.com/posts/Go/golang-menu/) + - [fmt 格式化语法](https://www.liwenzhou.com/posts/Go/fmt/) +- Go语言中文文档 :https://www.topgoer.com/ +- GO语言设计模式 :https://www.topgoer.cn/docs/golang-design-pattern/golang-design-pattern-1cbgha2ltg796 + +### GC + +- [知乎-Golang 内存管理之 GC](https://zhuanlan.zhihu.com/p/593008674?utm_id=0) + +### 安全编译 + +在Go语言中,“安全编译”可能指的是使用安全的编译参数,以确保代码的安全性和性能最优。这通常涉及到使用编译器的各种安全和性能参数,比如: + +使用 -s 或 -w 参数来减少编译后的二进制文件大小,去掉调试信息和符号信息。 + +使用 -ldflags 来设置链接器的标志,比如 -s -w 来进一步优化编译结果。 + +使用 -buildmode 参数来指定编译模式,比如 pie 来生成位置无关的可执行文件,增加安全性。 + +下面是一个简单的例子,演示如何使用 -ldflags 来优化编译结果: + +go build -ldflags "-s -w" -o myapp . + +这条命令会编译当前目录下的Go代码,并输出一个没有调试信息、符号和优化过的、体积更小的可执行文件 myapp。 + +如果你想进一步确保安全性,可以使用Go的安全性标志,比如 -tags safe,这取决于你使用的第三方库是否支持这个tag。 + +go build -tags safe -o myapp . + +请注意,每个项目可能有特定的安全和性能要求,因此编译参数应根据具体情况选择和调整。 + +```shell +# +go build -ldflags "-s -w -buildmode=pie -linkmode external -extldflags=-Wl,-z,relro,-z,now" -o CcspUtilRemote-`uname -m` +# +go build -tags safe -o myapp . +# 使用此命令查看 +go tool link --help +``` + +实际问题例子: + +```shell +# 安全编译检查 出现两个问题 [STACK CANARY/FORTIFY] +checksec --file=./xxx-x86_64 +# 处理[STACK CANARY/FORTIFY] 增加CGO 以及CGO代码文件cgo_safe.go +CGO_ENABLED=1 CGO_CFLAGS="-fstack-protector-all -D_FORTIFY_SOURCE=2 -O" go build -ldflags "-s -w -buildmode=pie -linkmode external -extldflags=-Wl,-z,relro,-z,now" -o xxx-`uname -m` +``` + +cgo_safe.go + +```go +package main + +import "C" +import "fmt" + +func init() { + s := C.CString("hello") + fmt.Println(s) + +} + +``` + +### 跨平台编译 + +具体操作 + +编译跨平台的只需要修改GOOS、GOARCH、CGO_ENABLED三个环境变量即可 + +- GOOS:目标平台的操作系统(darwin、freebsd、linux、windows) +- GOARCH:目标平台的体系架构32位还是64位(386、amd64、arm) +- 交叉编译不支持 CGO 所以要禁用它 + +### CGO + +- [CGO:让Go程序调用C函数的神器](https://blog.csdn.net/qq_42538588/article/details/131167683) +- [go语言调用c语言动态库及交叉编译](https://blog.csdn.net/weixin_43128854/article/details/122956384) + +### go mod 依赖问题 + +- go mod init:初始化go mod, 生成go.mod文件,后可接参数指定 module 名,上面已经演示过。 +- go mod download:手动触发下载依赖包到本地cache(默认为$GOPATH/pkg/mod目录) +- go mod graph: 打印项目的模块依赖结构 +- go mod tidy :添加缺少的包,且删除无用的包 +- go mod verify :校验模块是否被篡改过 +- go mod why: 查看为什么需要依赖 +- go mod vendor :导出项目所有依赖到vendor下 +- go mod edit :编辑go.mod文件,接 -fmt 参数格式化 go.mod 文件,接 -require=golang.org/x/text 添加依赖,接 -droprequire=golang.org/x/text 删除依赖,详情可参考 go help mod edit +- go list -m -json all:以 json 的方式打印依赖详情- +- [Golang中GoPath和GoModule模式的区别](https://blog.csdn.net/kenkao/article/details/124550249) + +### 代理 + +```shell +# +go env +# 原代理 +# GOPROXY='https://proxy.golang.org,direct' +# go模块(七牛云)代理 +go env -w GOPROXY=https://goproxy.cn,direct +``` \ No newline at end of file diff --git "a/docs/study/program/Golang/\345\270\270\347\224\250\347\232\204\345\267\245\345\205\267.md" "b/docs/study/program/Golang/\345\270\270\347\224\250\347\232\204\345\267\245\345\205\267.md" new file mode 100644 index 000000000..976e8bfaa --- /dev/null +++ "b/docs/study/program/Golang/\345\270\270\347\224\250\347\232\204\345\267\245\345\205\267.md" @@ -0,0 +1,5 @@ +### json-to-go + +- [https://mholt.github.io/json-to-go/](https://mholt.github.io/json-to-go/) +- [Go的json解析:Marshal与Unmarshal](https://blog.csdn.net/zxy_666/article/details/80173288) +- [Golang json 解析与生成](https://blog.csdn.net/K346K346/article/details/90482815) \ No newline at end of file