2014-02-08 69 views
2

我試圖在Delphi中找到一些如何使用Microsoft CryptoAPI簽署一段數據的完整示例。在線我發現大部分片段和僞代碼,但沒有具體的例子來說明如何做到這一點。使用MS cryptoAPI與Delphi簽署文檔

從我所瞭解的情況來看,花了一天的時間尋找代碼和信息,你可以創建基於公鑰的文檔/文件的哈希(或者如果你自己生成一對,或者由證書提供鑰匙扣)。然後該散列被編碼到加密的輸出文件(容器部分)中,並且可以由持有該私鑰的接收器驗證和解碼。

如果德爾福例如犯規存在,在那裏我可以用它來簽署文件/文件任何自由commanline程序?

我發現代碼MD5/SHA-1散列和還一個加密使用密碼的字符串(從導出在飛行中產生的keypar的散列)的文件。但遺憾的是沒有簽署一個流或一個文件。 對谷歌最近的比賽是由TurboPower公司(密碼箱),較舊的產品,但我不知道如果生成的輸出與MS的CryptoAPI兼容

更新(?):這是一起的我是什麼東西行尋找,但寫在C: http://blogs.msdn.com/b/alejacma/archive/2008/01/23/how-to-sign-and-verify-with-cryptoapi-and-a-user-certificate.aspx

此外,當你降級問題 - 足以描述你爲什麼這樣做。對於德爾福來說,對於您在大型企業應用中遇到的問題,這是一個完全有效的問題

+1

有一個Delphi MD5庫,'MessageDigest_5.pas'。它可以將一個動態字節數組作爲輸入,所以如果您願意,可以傳遞一個數據流。源代碼位於'.. \ Soap \ WsdlImporter'中,即使它在某些Delphi版本(例如XE3)中被錯誤省略。參見[Delphi-MD5:從Delphi 2007起MessageDigest_5單元已經存在](http://wiert.me/2009/12/11/delphi-md5-the-messagedigest_5-unit-has-been-there-since-delphi -2007 /)。 –

+0

或者你也可以直接使用MD5庫來支持流,['如何使用Delphi的標準函數對ASCII字符串進行單向散列?](http://stackoverflow.com/a/21638594/576719 )。 –

+1

我對此並不是很熟悉,但你看看這裏: http://sourceforge.net/projects/jedi-apilib/ 具體來說,http://sourceforge.net/p/jedi-apilib/代碼/ HEAD/tree/jwapi/trunk/Win32API/JwaWinCrypt.pas – MikeD

回答

3

我知道這是不好的形式真正的answere你自己的問題,但因爲似乎是德爾福下這個例子有點「動手」,我決定後我發現這裏幫助別人。

安全,證書和簽名是一個龐大而複雜的問題,需要認真研究,所以請原諒我這個職位的簡單性。這只是爲了讓人們指出正確的方向。

簽名XML,這是什麼意思?

在非常簡單的,動手而言,這是發生了什麼:

  • 您生成XML文檔的HASH(MD5例如,或 SHA1)
  • 您使用加密這個HASH私有密鑰,或者產生由自己 或提供/由證書衍生
  • 新的XML節點(DSIG簽名)插入其中包含加密的散列文件(和更多)

爲了驗證一個XML文件沒有被篡改,讀者必須使用公共密鑰的散列值進行解碼。因此,閱讀器軟件必須生成同一文檔的散列(不包括附加的XML),並將其與文檔中嵌入的(已解密)值進行比較。如果這些匹配,那麼我們知道文檔是完整的。只有使用有效密鑰解密附加散列時,它纔會匹配。因爲這是一項繁瑣的工作(並且它包含了很多步驟,比如在密鑰庫中查找提供程序(在我的情況下)以及更多),我最終從ELDOS(SecureBlackBox)購買了現成的VCL組件,這爲我節省了很多時間。

外部引用

+1

回答你自己的問題並不壞。 – EMBarbosa

相關問題