Public-Key
與 NaCl 共享密鑰加密的一種方法 - 為加密方生成一次性密鑰對是否安全
因此,我需要使用者能夠向我傳遞其他人無法讀取的資訊,因此我生成了一個密鑰。使用 NaCl,我從該密鑰創建一個密鑰對,並與我的使用者共享該密鑰對的公鑰。
現在,他們加密他們的資訊
nacl.box()
需要他們的消息,一個隨機數,我的公鑰,還有他們的私鑰?在過去,我傳統上使用非對稱加密,如AES(編輯:我的意思是 RSA)並且只需要我的公鑰……所以我只是在使用者端生成一個隨機密鑰對供使用者使用。我會打電話給這個throwawayKey
。encryptedMessage = nacl.box(message = "foo", nonce = 0, publicKey = MY_SHARED_KEY, secretKey = throwawayKey.secretKey());
然後他們可以將這條加密消息發回給我,並將我生成的一次性密鑰的公鑰發回給我:
throwawayKey.publicKey()
。然後,我可以稍後使用以下方法解密:
decryptedMessage = nacl.box.open(message = encryptedMessage, nonce = 0, publicKey = throwawayKey.publicKey(), secretKey = MY_SECRET_KEY);
這是讓使用者安全地將他們的資訊發送給我的安全方式嗎?
我不習慣為通用單向非對稱加密生成一次性密鑰對。只生成一個隨機的一次性密鑰感覺不對。我用錯了NACL嗎?
從文件中:
該
crypto_box
函式使用發送者的密鑰、接收者的公鑰和隨機數對消息進行加密和驗證。m
sk
pk``n
因此,密鑰(實際上是私鑰,但具有相同的首字母縮寫詞)用於身份驗證。如果您使用臨時(您稱之為“一次性”)密鑰對,那麼您將放棄對身份驗證的驗證。對於身份驗證,您需要信任發送者的公鑰——畢竟攻擊者也可以生成密鑰對。
好消息是經過身份驗證的加密至少應該防止明文預言機攻擊。這類攻擊可能會導致部分或全部明文洩露而不會洩露密鑰。
如果您希望使用者能夠匿名向您發送消息,您可以使用“密封框”而不是普通框。