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

Map 类型的 map[*rsa.PublicKey]*rsa.私钥具有值,但返回 nil

Map 类型的 map[*rsa.PublicKey]*rsa.私钥具有值,但返回 nil

Go
至尊宝的传说 2022-08-24 19:02:40
我有一个保存标题类型定义的结构。我创建了一个应该在映射中返回值的方法,但它得到的为零。我怀疑这是因为它处理指针的方式,但我不确定它在哪里或如何出错。发生了什么事情?以下是我为查看正在发生的事情而投入的一些额外内容的片段:func (s *stctClientPubKeys) GetServerPrivateKey(keyClientPubkey *rsa.PublicKey) *rsa.PrivateKey {var keyPrivateKey *rsa.PrivateKeys.RLock()keyPrivateKey = s.mpClientPubKeys[keyClientPubkey]s.RUnlock()// TODO Remove thisfmt.Print("KEYINSTRUCT ")fmt.Println(keyPrivateKey)s.RLock()fmt.Print("WHOLEMAPINSTRUCT ")fmt.Println(s.mpClientPubKeys)for k, v := range s.mpClientPubKeys {    chnLogging <- "GetServerPrivateKey(): Recv N = " + keyClientPubkey.N.String()    chnLogging <- "GetServerPrivateKey(): Key N  = " + k.N.String()    chnLogging <- "GetServerPrivateKey(): Val N  = " + v.PublicKey.N.String()}s.RUnlock()return keyPrivateKey}在示例运行中打印了哪些内容?KEYINSTRUCT <nil>WHOLEMAPINSTRUCT map[0xc00021e000:0xc0000644e0]GetServerPrivateKey(): Recv N = 284429934903843367309<cut>GetServerPrivateKey(): Key N  = 284429934903843367309<cut>GetServerPrivateKey(): Val N  = 238865868438483289364<cut>当我尝试访问返回的私钥时,最终结果当然是:panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x53ce07]
查看完整描述

1 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

正如 blackgreen 所暗示的那样,这可能是因为您在地图中存储了一个指针,而地图中的公钥在语义上是等效的,但不是索引。==

你没有说你如何获取函数的参数,但假设这是在某种服务器上,其中私钥是从线路或文件中解析的,你将获得一个新分配的对象。这将出现在地图中引用的内存中的其他位置,因此即使模量和指数相同,指针也会有所不同。该类型具有可用于比较的 Equal 方法,因为此方法不起作用。==

有两种简单的方法可以获得我怀疑你想要的行为:

  1. 使用切片并循环访问,调用 。Equal(keyClientPubkey) 在每个,而不是一个映射。只要您拥有的公钥少于数百个,这可能就可以了。(基准测试可以告诉您环境中的确切断点)

  2. 创建一个帮助器函数,该函数采用 a 并返回可用作键的可比较内容(例如字符串)。一个简单的版本是类似于 .使用它,您可以基于字符串表示形式存储和检索公钥。toMapKey*rsa.PublicKeyreturn fmt.Sprintf("n=%x|e=%x", pk.N, pk.E)

注意:如果这是安全敏感代码路径(例如,如果对手可以随意触发它),我不建议使用上述任何一种方法,因为您可能会泄露计时信息。如果是这种情况,请向安全专家寻求帮助,:)。如果你只是在启动期间这样做,那可能没问题。


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

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