nkeys 是一种基于 Ed25519 的新型、高度安全的公钥签名系统。
使用nkeys,服务器可以验证身份,而无需存储或查看私钥。
身份验证系统的工作原理是要求连接的客户端提供其公钥并使用其私钥对随机挑战码(challenge)进行数字签名。服务器为每个连接请求生成一个随机挑战码,使其免受攻击。生成的签名根据提供的公钥进行验证,从而验证客户身份。如果服务器有公钥,则认证成功。
处理32字节和64字节的原始密钥比较麻烦,nkeys以更友好的方式制定密钥,并参考在加密货币中完成的工作,特别是Stellar。
nkeys使用类似的格式,其中公钥和私钥的前缀为1个字节,种子的前缀为2个字节。
这些前缀的base32编码将产生友好的人类可读前缀:
- 公钥前缀只有一个字符: ‘N’=服务器,‘C’=集群,‘O’=操作员,‘A’=账户,‘U’=用户。
- 私钥前缀和种子前缀都有两个字符: 第一个字符中,‘P’用于私钥,‘S’用于种子。
- 种子前缀有两个字符,第一个字符是"S",第二个字符是公钥的类型,例如"SU"是用户密钥对的种子,“SA"是账户密钥对的种子。
密钥类型 | 前缀 | 说明 | 示例 (格式示意) |
---|---|---|---|
种子 (Seed) | S + 类型字符 | 这是私钥的种子形式,是唯一需要安全保存的。第二个字符标识其关联的公钥类型。 | SU…(用户种子) |
私钥 (Private Key) | P + 类型字符 | 由种子派生出的完整私钥,前缀为 ‘P’ 后跟一个类型字符。 | PU…(用户私钥) |
公钥 (Public Key) | 类型字符 | 公开的身份标识,前缀直接表示其类型。 | U…(用户公钥) |
- 生成用户类型的密钥对
$ nk -gen user -pubout > cj.nk
$ cat cj.nk
SUAHY6RLMXSICA5WVLDWLSZT67AX3RA576Q5SJCNPONEWPP7CAOVMCYW6A
UDUYLUY2J2EGSEW5EOARBBVS2GV6QLXUFUPIGI5OVDQRZC5H4EK6YJFZ
- 服务端配置
jetstream: enabled
http_port: 8222
authorization {
users: [
{nkey: UDUYLUY2J2EGSEW5EOARBBVS2GV6QLXUFUPIGI5OVDQRZC5H4EK6YJFZ}
]
}
- 客户端如何连接
$ nats account info --nkey ./cj.nk
- go代码中如何连接服务端
func main() {
opt, err := nats.NkeyOptionFromSeek("./cj.nk")
if err != nil {
log.Fatal(err)
}
nc, err := nats.Connect("127.0.0.1", opt)
if err != nil {
log.Fatal(err)
}
defer nc.Close()
nc.Publish("hello", []byte("world"))
}
本文发表于 0001-01-01,最后修改于 0001-01-01。
本站永久域名「 jiavvc.top 」,也可搜索「 后浪笔记一零二四 」找到我。