是的,你是對的,在目前的CMS RFC它說,有關該消息的摘要屬性,它
一個個SignerInfo 的SignedAttributes必須包含只有一個消息摘要屬性的實例。 類似地,AuthenticatedData中的AuthAttributes只能包含 message-digest屬性的一個實例。
因此,使用標準簽名屬性提供多個消息摘要值的唯一方法是提供幾個signedInfos。
是的,任何安全系統都與其最薄弱的環節一樣強大,因此從理論上說,如果您仍然接受SHA-1,您就不會通過添加帶有SHA-256的SignedInfo獲得任何東西 - 正如您所說的那樣,總是被剝奪。
您的具有自定義屬性的方案有點難以打破 - 但仍然存在可被攻擊的SHA-1哈希值。它不再像剝離屬性那樣簡單 - 因爲它被簽名覆蓋。但是:
還有摘要算法用於消解作爲最終簽名值基礎的簽名屬性。你打算在那裏使用什麼? SHA-256或SHA-1?如果是SHA-1,那麼你將會和以前一樣:
如果我可以產生SHA-1的衝突,那麼我會剝離你的自定義SHA-256屬性,並僞造SHA-1屬性這樣簽名的最終SHA-1摘要再次疊加起來。這表明,如果簽名摘要算法也是SHA-256,那麼只有安全性有所增加,但我猜這是不可取的,因爲你想保持向後兼容。
我在你的情況下建議的是始終使用SHA-1,但將符合RFC 3161的時間戳作爲無符號屬性應用於簽名。這些時間戳實際上是他們自己的簽名。好處是您可以在那裏使用SHA-256作爲郵件印記,並且時間戳服務器通常使用您提供的相同摘要算法來應用其簽名。然後拒絕任何不包含此類時間戳或僅包含消息壓印/簽名摘要算法弱於SHA-256的時間戳的簽名。
這個解決方案有什麼好處?您的遺留應用程序應該檢查是否存在未簽名的時間戳記屬性,並且是否使用了強大的摘要,但是否則忽略它們並繼續按照之前的相同方式驗證簽名。另一方面,新應用程序將驗證簽名,但也會驗證時間戳。由於時間戳簽名「覆蓋」了簽名值,因此攻擊者不再僞造簽名。儘管簽名使用SHA-1作爲摘要值,但攻擊者必須能夠打破時間戳的更強的摘要。
時間戳的額外好處是您可以將生產日期與簽名關聯起來 - 您可以安全地聲明簽名是在時間戳之前生成的。所以,即使簽名證書被撤銷,在時間戳的幫助下,您仍然可以根據證書被吊銷的時間,精確決定是否拒絕或接受簽名。如果證書在時間戳後被撤銷,那麼您可以接受簽名(添加安全邊界(又稱「寬限期」) - 在信息發佈之前需要一段時間),如果在時間戳之前被撤銷那麼你想拒絕簽名。
時間戳的最後一個好處是,如果某些算法變弱,您可以隨時更新它們。例如,您可以使用最新的算法每5-10年應用一次新的時間戳,並使新的時間戳涵蓋所有較舊的簽名(包括較舊的時間戳)。這種方式弱算法,然後由較新的,更強大的時間戳簽名覆蓋。看看CAdES(也存在RFC,但現在已經過時了),它基於CMS並嘗試應用這些策略來爲CMS簽名提供長期歸檔。
事實上,使用每個signerInfos簽名算法對認證的屬性進行身份驗證是不是?如果是這樣,我認爲你還是在同一條船上。 –
好點。我認爲已認證的屬性本身可以包含一個使用SHA256作爲其消息摘要算法的SignedData元素,其ContentInfo包含原始內容的SHA256摘要。但是你仍然使用保護整個bundle的弱散列算法。 – John
我已經能夠得到一個時間戳,但我不知道如何將其嵌入到現有的簽名。 目前我正在做這個: http://stackoverflow.com/questions/38618108/s-mime-timestamp-support/38631998#38631998 – Michael