2011-08-17 51 views
6

我正在研究將應用程序從SHA1升級爲默認PKCS#7 SignedData摘要算法,以強化摘要(如SHA256),以保持對不支持摘要的簽名驗證程序的向後兼容性SHA1以外的算法。我想檢查一下我對PKCS#7格式和可用選項的理解。PKCS#7 SignedData和多個摘要算法

我想要做的是使用SHA1和SHA256(或更一般地說,一組摘要算法)摘要消息內容,以便舊應用程序可以繼續通過SHA1進行驗證,並且已升級的應用程序可以開始通過SHA256(更一般地說,提供最強的摘要)忽略較弱的算法。 [如果有更好的方法,請告訴我。]

似乎在PKCS#7標準中,提供多個摘要的唯一方法是提供多個SignerInfos,每個摘要算法一個。不幸的是,這看起來會導致安全性下降,因爲攻擊者能夠用最薄弱的摘要算法去除除SignerInfo之外的所有信息,而這個算法本身仍然會形成有效的簽名。這種理解是否正確?

如果是這樣,我的想法是使用SignerInfo的authenticatedAttributes字段中的自定義屬性爲額外的摘要算法提供額外的消息摘要(將SHA1作爲向後兼容的「默認」算法)。由於該字段被認證爲單個塊,因此可以防止上述攻擊。這似乎是一種可行的方法嗎?有沒有辦法在不超出PKCS標準的情況下完成這個或類似的事情?

+1

事實上,使用每個signerInfos簽名算法對認證的屬性進行身份驗證是不是?如果是這樣,我認爲你還是在同一條船上。 –

+0

好點。我認爲已認證的屬性本身可以包含一個使用SHA256作爲其消息摘要算法的SignedData元素,其ContentInfo包含原始內容的SHA256摘要。但是你仍然使用保護整個bundle的弱散列算法。 – John

+0

我已經能夠得到一個時間戳,但我不知道如何將其嵌入到現有的簽名。 目前我正在做這個: http://stackoverflow.com/questions/38618108/s-mime-timestamp-support/38631998#38631998 – Michael

回答

8

是的,你是對的,在目前的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簽名提供長期歸檔。

+0

真棒回答,謝謝。我一定會考慮時間戳。你提到的額外好處是有吸引力的。 – John

+0

是的,但它們確實帶來了不利影響 - 如果你想要「真正的」時間戳,那麼你可能需要向服務支付一個CA。但是如果你不需要「真正」的證書,你可以使用你自己的本地時間戳服務器。 – emboss