Public-Key
使用相同的非對稱密鑰簽署不同類型的消息
我希望能夠使用相同的非對稱密鑰簽署不同類型的消息。(為了完整起見,我使用 Ed25519 作為我的簽名)。
我為什麼要這樣做?
相同的密鑰用於簽署不同類型的消息。如果我不使用某種方法來區分消息類型,攻擊者可能會要求我簽署一種類型的消息,然後將其用作另一種類型的消息。
範例粗溶液
對於快速原型,我使用了以下粗略的方法。
要簽署類型 1 的消息:
$ \operatorname{Sign}[\text{key}](\text{“type1” }||\text{ message}_1) $
要簽署類型 2 的消息:
$ \operatorname{Sign}[\text{key}](\text{“type2” }||\text{ message}_2) $
我有一種感覺,這不是在消息類型之間進行良好分離的最佳方式。如果一種類型字元串是另一種類型字元串的子字元串,則尤其如此。例如,我記得 HMAC 和 hkdf 使用更複雜的機制(它們不只是連接)。
我不想在這裡重新發明輪子。有解決這個問題的通用做法嗎?
只要前綴
type1
type2
等是不同的,大小相等,並且在所有簽名之前始終插入,所提議的內容就非常好,並且是常見的做法。前綴是不同的並且大小相等是實現必要和充分要求的簡單且萬無一失(因此很好)的方法:沒有前綴應該是另一個前綴的開始。
如果由於某種原因前綴必須具有不同的大小,確保滿足此要求的可能約定包括:
- 前綴的字節大小在前綴之前,佔 1 個字節(Pascal 字元串約定)。
- 一個特殊的終止字節位於所有前綴的末尾,而不是在前綴的其他地方使用。常見的選擇包括字節 0x00(C 字元串約定)或分隔符,如
:
- 使用不同字元串前綴的雜湊 (SHA-512/256),如評論中所建議的那樣。由於這是恆定大小,因此要求歸結為使用不衝突的字元串前綴,我們甚至不知道如何製作。
在復雜性範圍的上端:所有簽名都可以按照適當的ASN.1 語法進行。當心複雜性退化為互操作性問題,甚至是可利用的缺陷。