加密、解密、签名、验签等操作总少不了对秘钥的处理,秘钥的存储格式决定了解析方式。在
golang中关于RSA加密、解密、签名、验签的总结
一文中提到的仅是针对的字符串类型的秘钥处理,本文中将对常见的几种RSA秘钥存储格式及解析方式做个总结。
常见的几种秘钥存储格式有:字符串、证书文件、n/e参数等,以下介绍具体格式的解析处理。
这是最常见的一种形式,通常RSA的秘钥都是以hex、base64编码后的字符串提供,如证书内的秘钥格式即是base64编码的字符串,然后添加前后的具体标识实现的。可以通过解码字符串,构建公钥/私钥。
注意:base64存在几种细节不同的编码格式,StdEncoding、URLEncoding、RawStdEncoding、RawURLEncoding,使用时还需要进一步确认秘钥具体编码格式,避免解码出错。以下未特殊说明的例子中均默认使用StdEncoding。
直接hex、base64解码后调用x509.ParsePKIXPublicKey即可。
key, _ := hex.DecodeString(publicKeyStr)
publicKey, _ := x509.ParsePKIXPublicKey(key)
由于RSA私钥存在PKCS1和PKCS8两种格式,因此解码后需要根据格式类型调用对应的方法即可。一般java使用pkcs8格式的私钥,其他语言使用pkcs1格式的私钥。使用时,记得确认下格式。
key, _ := base64.StdEncoding.DecodeString(pkcs1keyStr)
privateKey, _ := x509.ParsePKCS1PrivateKey(key)
key, _ := hex.DecodeString(pkcs8keyStr)
privateKey, err := x509.ParsePKCS8PrivateKey(key)
.pem、.cert、.cer、.crt等都是pem格式的文件,只是文件后缀不一。
PEM是Privacy Enhance Mail的缩写,PEM实质上是Base64编码的二进制内容(即对字符串格式私钥的文件化处理),再加上开始和结束行。
解析方式:读取文件,调用pem.Decode,然后按照base64解码,再解析成公钥/私钥。
key,_ := ioutil.ReadFile("pem_file_path")
block, _ := pem.Decode(key)
privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
publicKey, _ := x509.ParsePKIXPublicKey(key)
.pkcs12、.pfx、.p12这些文件格式存储的是已加密后的内容,可以通过openssl转换成pem文件后进行处理。
提取密钥对:
openssl pkcs12 -in in.p12 -out out.pem -nodes
这种就是比较特殊的。
例如:login with apple keys的公钥就是这种格式的,需要根据n,e构造出公钥。
"kty": "RSA",
"kid": "eXaunmL",
"use": "sig",
"alg": "RS256",
"n": "4dGQ7bQK8LgILOdLsYzfZjkEAoQeVC_aqyc8GC6RX7dq_KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdDNq1n52TpxQwI2EqxSk7I9fKPKhRt4F8-2yETlYvye-2s6NeWJim0KBtOVrk0gWvEDgd6WOqJl_yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X-Tip84wqwyRpUlq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll-p_Dg8vAXxJLIJ4SNLcqgFeZe4OfHLgdzMvxXZJnPp_VgmkcpUdRotazKZumj6dBPcXI_XID4Z4Z3OM1KrZPJNdUhxw",
"e": "AQAB"
使用时就需要,将N,E解析成big.Int格式,注意N、E的base64的具体编码格式:
pubN, _ := parse2bigInt(n)
pubE, _ := parse2bigInt(e)
pub = &rsa.PublicKey{
N: pubN,
E: int(pubE.Int64()),
func parse2bigInt(s string) (bi *big.Int, err error) {
bi = &big.Int{}
b, err := base64.RawURLEncoding.DecodeString(s)
if err != nil {
return
bi.SetBytes(b)
return
以上是常见的几种密钥格式的解析方式,除了最后一种的指向性比较明确外,其他的解析方式还可以用于其他加密方式,因为说到底这些解析方式对应的就是秘钥存储的方式。
文章目录前言解析方式1. 字符串格式(1)公钥(2)私钥2. 证书文件格式(1).pem、.cert、.cer、.crt(2).pkcs12、.pfx、.p123. N,E参数总结前言加密、解密、签名、验签等操作总少不了对秘钥的处理,秘钥的存储格式决定了解析方式。在golang中关于RSA加密、解密、签名、验签的总结一文中提到的仅是针对的字符串类型的秘钥处理,本文中将对常见的几种RSA秘钥存...
1.服务RSA密钥对可以放到缓存中,设置有效期;
2.注意公钥和私钥是配套使用的,公钥加密,私钥解密;私钥不正确的时候,最好同时处理公钥和私钥;
3.私钥不能直接通过明文的方式传输,可先存储起来,再生成唯一标识,将唯一标识和私钥映射起来;后续通过唯一标识找到对应私钥;
urlencode:编码 URL 字符串,返回字符串,此字符串中除了-_.之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。
rawurldecode与urlencode同样用于编码URL字符串,区别在于rawurldecode会将空格则编码为“%20”
2、PHP语言中对URL的编码和解码
在PHP中使用rawurlencode和r...
一、RSA算法概述
RSA是"非对称加密算法",非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公钥与私钥是配对的,用公钥加密的数据只有配对的私钥才能解密,反之亦然。因加解密使用两个不同的密钥,所以这种算法叫作非对称加密算法。
使用RSA加密算法流程如下:
1.消息接收方B先把公钥广播,消息发送方A保存B的公钥
2.当A需要向B发送消息时,先用B的公...
#在证书文件目录下执行下面命令 查询名称为 cer格式的文件,取 name 属性值作为 openssl命令的参数
find ./ -name "*.cer" |xargs -i openssl x509 -in {} -noout -dates
#如果证书文件少,可以直接查看这个证书的时间:
openssl x509 -in acp_prod_verify.cer -noout -dates
查看私钥证书的过期时间:
我们可以先从私钥证书中提取出公钥证书,然后查看公钥证书的过期时间
# 从pf.
name相同为一组复选框实现单选
在百度上找了但是没有发现合适的 都是单组或者少name相同的复选框实现单选 每次都要单独绑定通用性不高,后面自己动手写了 代码比较多 应该有更简洁的实现
1.第一版但是有Bug
<!DOCTYPE HTML>
<title>一组name相同的checkbox设置只能单选</t...
在 Golang 中,可以使用第三方库来解析 pcap 文件,例如 GoPacket 和 gopacket/pcap。这里以 gopacket/pcap 为例,介绍如何使用 Golang 解析 pcap 文件。
首先,需要使用 go get 命令安装 gopacket/pcap 库:
go get github.com/google/gopacket/pcap
接下来,可以使用以下示例代码来读取和解析 pcap 文件:
```go
package main
import (
"fmt"
"log"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
func main() {
// 打开 pcap 文件
handle, err := pcap.OpenOffline("test.pcap")
if err != nil {
log.Fatal(err)
defer handle.Close()
// 循环读取数据包
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
// 解析以太网帧
ethernetLayer := packet.Layer(layers.LayerTypeEthernet)
if ethernetLayer == nil {
fmt.Println("Not an Ethernet frame")
continue
// 解析 IP 数据包
ipLayer := packet.Layer(layers.LayerTypeIPv4)
if ipLayer == nil {
fmt.Println("Not an IPv4 packet")
continue
// 解析 TCP 数据包
tcpLayer := packet.Layer(layers.LayerTypeTCP)
if tcpLayer == nil {
fmt.Println("Not a TCP packet")
continue
// 获取 TCP 数据
tcpPacket, _ := tcpLayer.(*layers.TCP)
payload := tcpPacket.Payload
// 处理 TCP 数据
fmt.Printf("TCP Payload: %s\n", string(payload))
这个示例代码可以打开一个名为 "test.pcap" 的 pcap 文件,并循环读取其中的数据包。对于每个数据包,它会先解析以太网帧、IP 数据包和 TCP 数据包,然后获取 TCP 数据并进行处理。
需要注意的是,这个示例代码仅适用于 TCP 数据包,并且假定 TCP 数据是 ASCII 编码的文本数据。如果需要处理其他类型的数据包或二进制数据,需要进行相应的修改。