go - 证书固定 - 用于许可证分发的公钥/私钥
问题描述
我正在尝试分发应用程序 - 并且需要添加软件许可证才能让用户使用该应用程序。我需要在许可证中分发一些有关授权的信息(仅使用公钥/私钥时效果很好)
伪步骤
- 生成公钥/私钥
- 在代码中嵌入公钥
- 使用编码创建许可证
- 分发许可证文件
- 应用程序使用嵌入式公钥验证许可证
6.问题(使用证书验证公钥的来源)
实际步骤:
1. 生成公钥/私钥
openssl genrsa -out private_key.pem 3072
openssl rsa -in "private_key.pem -pubout -out public_key.pem
2 - 5 然后将私钥嵌入代码中,并读取许可证文件,如(代码来自此处):
func VerifyAndExtractPayload(publicKey *rsa.PublicKey, str string) (interface{}, error) {
var err error
str = strings.TrimSpace(str)
if !strings.HasPrefix(str, header) || !strings.HasSuffix(str, footer) {
return nil, errors.New("invalid license key")
}
b64 := strings.Replace(str[len(header):len(str)-len(footer)], "\n", "", -1)
var l license
b, err := base64.StdEncoding.DecodeString(b64)
licenseBuffer := bytes.Buffer{}
licenseBuffer.Write(b)
licenseDecoder := gob.NewDecoder(&licenseBuffer)
if err = licenseDecoder.Decode(&l); err != nil {
return nil, err
}
hashed := sha256.Sum256(l.Payload)
if err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hashed[:], l.Signature); err != nil {
return nil, err
}
var payload interface{}
payloadBuffer := bytes.Buffer{}
payloadBuffer.Write(l.Payload)
payloadDecoder := gob.NewDecoder(&payloadBuffer)
if err = payloadDecoder.Decode(&payload); err != nil {
return nil, err
}
return payload, nil
}
然后我意识到也许我应该使用证书固定,所以没有人可以替换公钥。
伪代码:
- 使用私钥生成根证书
- 嵌入证书
- 像上面一样生成许可证
- 从证书中读取公钥
- 应用程序使用嵌入式公钥验证许可证
问题:
- 如何验证从证书中读取公钥?
- 公钥现在是否经过验证?
解决方案
推荐阅读
- ruby-on-rails - 非确定性 NameError:ActiveRecord 模型上的未初始化常量
- unity3d - unity vr 构建错误
- python - python使用@方法替换一个值
- flutter - 使用 data_usage 插件时出错:未处理的异常:PlatformException(PERMISSION_NOT_GRANTED,null,null,null)
- security - 在应用程序中存储主机和端口数据是否会使服务器易受攻击?
- spring - CSRF 令牌已配置,但 POST 请求仍然无法在 Spring Boot 应用程序中工作
- optaplanner - 规划实体字段上的 @ValueRangeProvider 注释
- python - 如何对kafka生产者进行单元测试(python)
- elasticsearch - 从弹性索引中提取数据,处理并返回
- angularjs - Asp.net Core 项目中的 Azure Dev Ops 查询生成器