为了账号安全,请及时绑定邮箱和手机立即绑定

从 Golang 类型中提取未导出字段的正确方法是什么?

从 Golang 类型中提取未导出字段的正确方法是什么?

Go
侃侃无极 2021-10-25 16:26:27
我正在尝试获取 SSH 公钥(x.crypto.ssh.PublicKey,通过解析生成authorized_keys)并从中提取一个普通的旧crypto.rsa.PublicKey密钥(我知道密钥的类型是ssh-rsa)。这意味着,在 ssh-land 中,密钥是 (unexported) 类型的rsaPublicKey。通过使用reflect.Interface()或普通旧,fmt.Sprintf("%v")我可以获得一个如下所示的值:&{133141753607255377833524803712241410600224583899447743985716492314976605735038858392516407436607315136967439536840885454950028631410155683051419836325912444338003188332463816050354540934271243064035037856360864190161298769948076508355604915775510460445701536855931828420791030023079646791573156484306628882221 35}我知道,通过阅读 ssh 包源,这ssh.rsaPublickey实际上定义为我想要的类型:type rsaPublicKey rsa.PublicKey因此这个价值已经是我想要的东西。(事实上,我可以使用"%+v",甚至看到它的字段(当然)被命名为N和E。)我的问题是,我不知道有什么更好的方法可以让 Go 相信这实际上是 an ,而rsa.PublicKey不是将每个数字提取到字符串中fmt.Sscan,然后分别转换为big.Int和int,然后使用我刚刚得到的两个值作为模数和指数来创建一个新的rsa.PublicKey.这有效,但似乎令人难以置信的讨厌。我明白了,因为它是未导出的,可能没有直接的路线,但肯定有比重新转换它们的可打印表示更好的方法来获取字段。ssh.PublicKey确实有一个Marshal()函数,但这给了我线格式的表示,如果我通过那里,好吧,我想它可以避免滥用类型系统,但我最终会编写自己的字节流到大-Int-to-RSA 转换器在那里,这似乎并没有真正帮助。那时,我不妨从authorized_keys文件开始并自己解析它,这似乎也很愚蠢。这样做的正确方法是什么?
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 330 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信