数字签名
签名过程
- 对内容做哈希
- 使用私钥对哈希签名
- 将源文件和签名一起发送
验证过程
- 对内容做哈希,得到哈希1
- 使用公钥对签名进行校验,得到哈希2
- 比较哈希1和哈希2
go实现
签名过程:
func RsaSignData(filename string, src []byte) ([]byte, error) {
//读取私钥
priKey, err := readRsaPriKey(filename)
if err != nil {
return nil, err
}
//对内容进行哈希
hash := sha256.Sum256(src)
//数字签名。参数1:随机数。参数2:私钥。
//参数3:哈希方法。参数4:内容的哈希值
signData, err := rsa.SignPKCS1v15(rand.Reader, priKey, crypto.SHA256, hash[:])
if err != nil {
return nil, err
}
return signData, nil
}
认证过程:
func RsaVerifyData(filename string, src []byte, signData []byte) bool {
//读取公钥
pubKey, err := readRsaPubKey(filename)
if err != nil {
fmt.Println(err)
return false
}
//对内容进行哈希
hash := sha256.Sum256(src)
//签名认证。参数1:公钥。参数2:哈希算法。
//参数3:哈希值。参数4:待验证的数字签名。
err = rsa.VerifyPKCS1v15(pubKey, crypto.SHA256, hash[:], signData)
if err != nil {
fmt.Println(err)
return false
}
return true
}
非对称加密存在的问题
公钥分发困难:中间人攻击
解决方法:引入第三方认证机构,CA
(Certificate Authority
):为厂商提供数字证书,从而解决公钥分发困难的问题。