亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號