1. 程式人生 > >數字簽名(程式碼簽名)流程和數字簽名的驗證

數字簽名(程式碼簽名)流程和數字簽名的驗證

http://blog.csdn.net/shifancc/article/details/41313969

Authenticode : 這裡翻譯為數字認證程式碼。 
code sign : 字面的翻譯為程式碼簽名,但是通常的我們稱為數字簽名,以下的文中均稱為數字簽名。



一 數字認證碼
如果你是軟體開發人員,你可能已經知道windows系統和一些瀏覽器(例如IE,Firefox)使用一種稱為數字認證程式碼的技術來標識軟體的發行商,來檢查軟體沒有被病毒影響。如果你的軟體沒有用數字認證程式碼簽名,使用者將會收到一個警告“此軟體發行商不能被成功的驗證,你是否要繼續執行此軟體“,很多的使用者為了安全起見將放棄對此軟體的使用。

如果你的軟體是提供給專業的人員使用,結果肯能會更糟。許多公司的IT安全策略禁止沒有用數字認證碼簽名的軟體的執行。

同時微軟Windows也使用數字簽名證書來判斷潛在的惡意軟體。如果你的setup.exe沒有進行數字認證證書的簽名,你的軟體的名譽將遭受損害。

在Vista系統增加UAC之後,情況變的更糟,如果你的軟體沒有使用數字認證證書籤名,且在執行時需要管理員的許可權,則會出現警告對話方塊”不可識別的程式想訪問你的計算機“,這個時候很多的使用者可能認為是病毒,會禁止使用你的軟體。

二 數字認證碼的原理

數字簽名程式碼是一種技術,它使用數字證書來識別軟體的釋出商和使用hash演算法來確保軟體的完整性。數字簽名使用公共密匙簽名書法被建立,它使用兩種不同的密匙:公共密匙和私有密匙,我們稱其為密匙對。私有密匙一般為擁有者所有,公有密匙對所有的人都可見。


數字簽名的過程本質上為:

簽名軟體對要簽名的軟體建立hash;

使用釋出者的私有密匙來加密軟體的hash;

被加密的hash和釋出者的數字證書被插入到要簽名的軟體;


數字簽名的驗證過程本質上為:

使用者對要驗證的軟體建立hash;

使用釋出者的公共密匙來解密被加密的hash;

比較解密的hash和新獲得的hash,如果匹配說明簽名是正確的,軟體沒有被修改過;


三 數字簽名
數字簽名是對軟體進行標識的一個流程,它通過對軟體增加了釋出商的資訊來檢查軟體在釋出後是否被修改或受病毒影響。在軟體出售前進行簽名已經成為了行業範圍的專業實踐。隨著使用者的安全意識的提高,現在越來越多的使用者限制下載未簽名的軟體,因此作為專業的軟體公司,在軟體出售前進行簽名已經成為必不可少的一步。

要進行數字簽名,需要以下準備:
1)數字證書和密碼;
2)數字簽名工具;
3)時間戳伺服器的URL地址;


四 數字簽名工具
數字簽名工具, 微軟提供了兩套數字簽名工具,

1)signcode.exe, 從1998年開始使用,隨.NET Framework SDK釋出。

signcode.exe 數字簽名工具

makecert.exe 建立數字證書

cert2spc.exe 將數字證書轉化為軟體釋出者證書格式


2)signtool.exe,隨visualstudio 2005及其以後的版本釋出。

signtool.exe 數字簽名工具

makecert.exe 建立數字證書

cert2spc.exe 將數字證書轉化為軟體釋出者證書格式

pvk2pfx.exe(pvkimprt.exe) 將私有的密匙和軟體釋出者證書合併為pfx檔案,此檔案將被signtool.exe使用


上面2中工具的不同是signcode.exe需要輸入私有密匙和軟體釋出者證書(pvk和spc檔案),signtool.exe只需要輸入由pvk和spc合併產生的一個個人資訊互動檔案(pfx)。


五 獲得數字證書

數字證書,你可以建立自己的數字證書來測試數字簽名的流程,但是正式的軟體釋出,你需要向可信賴的證書頒發機構購買數字證書和密碼,例如你可以向以下的證書機構購買Comodo, Globalsign, Thawte and Verisign。


建立自己的數字證書(用來測試)

使用如下命令來建立自己的數字證書:
makecert.exe -sv mykey.pvk -n "CN=Acme Software Inc." mycert.cer你可以將Acme Software Inc.替換為你自己公司的名字。如果mykey.pvk不存在的話,你會要求輸入私有密匙的密碼,密碼可以為空。安全起見最好設定密碼,否則別人拿到你的私有密匙後就可以簽名了。在上面的命令後,產生了2個檔案mykey.pvk和mycert.cer。接下來需要將數字證書(cer)轉化為軟體釋出商證書(spc),命令如下:cert2spc.exe mycert.cer mycert.spc此過程中需要輸入私有密匙的密碼,建立完成後應該會生成mycert.spc檔案,當數字簽名時mycert.cer檔案是不需要的。 


1)使用signcode.exe,如下:
signcode.exe -t <timestamp URL> -spc mycert.spc -v mykey.pvk "<file to be signed>"進行數字簽名的檔案可以是.exe, .dll, .ocx 或者是其他的可執行檔案。

2)使用signtool.exe,如下:

如果你沒有pfx檔案,需要使用以下的命令來將pvk和spc檔案合併為pfx,如果沒有設定密碼的話必須使用pvkimprt.exe來合併。pvk2pfx.exe -pvk mykey.pvk -pi <password> -spc mycert.spc -pfx mycert.pfx -po <password>pvkimprt.exe -pfx mycert.spc mycert.pvksigntool.exe sign /f mycert.pfx /p <password> /t <timestamp URL> /v "<file to be signed>" 
以下是使用signtool.exe簽名的一個例項:
signtool.exe sign /f mycert.pfx /p <password> /t <timestamp URL> /v "<file to be signed>"

Here is the Sample Output:
The following certificate was selected:
Issued to: SID Software Inc.
Issued by: Thawte Code Signing CA
Expires: 10/16/2011 2:17:15 AM
SHA1 hash: 4374SD894388B9H456E206124G06D9AV1535G12E

Done Adding Additional Store

Attempting to sign: jservice.exe
Successfully signed and timestamped: jservice.exe

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

Code-Signing Best Practices : http://msdn.microsoft.com/en-us/windows/hardware/gg487309.aspx

通常的我們在軟體釋出前要對binary(dll,exe)進行數字簽名,數字簽名可以標識軟體的釋出商,也可以通過數字簽名來檢查此軟體是否被修改或受病毒影響。

在需要檢查某個檔案的數字簽名時,通常情況下總是需要開啟檔案的屬性對話方塊,切換到“數字簽名”對話方塊,然後才能在這裡檢視到相關的數字簽名信息,如下圖:



sigcheck是來自sysinternals的數字簽名驗證工具,可以檢視指定的檔案或目錄下的哪些檔案沒有數字簽名。 此工具是命令列工具,可以用來批量檢查某個資料夾下相關檔案的數字簽名。

幫助如下:

 

使用如下:

對目錄C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE及子目錄下的所有的binaries檢查數字簽名,將沒有簽名的檔案輸出到sigcheck.txt中。 

sigcheck -s -q -e -u "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE" > sigcheck.txt

執行後的sigcheck.txt類似於如下:  

c:\program files (x86)\microsoft visual studio 10.0\common7\ide\coloader80.tlb:
    Verified:    Unsigned
    File date:    12:17 AM 3/18/2010
    Publisher:    Microsoft Corporation
    Description:    VS Loader Type Library
    Product:    Microsoft?Visual Studio?2010
    Version:    10.0.30319.1
    File version:    10.0.30319.1 built by: RTMRel
c:\program files (x86)\microsoft visual studio 10.0\common7\ide\devenv.com:
    Verified:    Unsigned
    File date:    3:04 AM 3/18/2010
    Publisher:    Microsoft Corporation
    Description:    Microsoft Visual Studio Command Line
    Product:    Microsoft?Visual Studio?2010
    Version:    10.0.30319.1
    File version:    10.0.30319.1 built by: RTMRel
c:\program files (x86)\microsoft visual studio 10.0\common7\ide\PrivateAssemblies\Microsoft.TeamFoundation.OfficeIntegration.Common.tlb:
    Verified:    Unsigned
    File date:    4:28 AM 3/18/2010
    Publisher:    Microsoft Corporation
    Description:    Microsoft.TeamFoundation.OfficeIntegration.Common.dll
    Product:    Microsoft?Visual Studio?2010
    Version:    10.0.30319.1
    File version:    10.0.30319.1 built by: RTMRel
c:\program files (x86)\microsoft visual studio 10.0\common7\ide\PrivateAssemblies\Microsoft.VisualStudio.OLE.Interop.dll:
    Verified:    Unsigned
    File date:    6:22 PM 11/20/2009
    Publisher:    Microsoft Corporation
    Description:    
    Product:    Microsoft?Visual Studio .NET
    Version:    7.10.6070
    File version:    7.10.6070