CryptoAPI呼叫指南(四) 數字簽名及驗證

2021-10-08 05:34:09 字數 2115 閱讀 8532

七、 數字簽名

和非對稱加密類似,數字簽名通過呼叫cryptsignmessage這乙個方法即可實現,這乙個方法裡將摘要運算和私鑰加密摘要兩步都包含進去了。

bool cryptsignmessage(

pcrypt_sign_message_para psignpara,

bool fdetachedsignature,

dword ctobesigned,

const byte * rgpbtobesigned,

dword rgcbtobesigned,

byte *pbsignedblob,

dword *pcbsignedblob

)psignpara是簽名引數,比如可做如下設定:

crypt_sign_message_para sigparams;

sigparams.cbsize = sizeof(crypt_sign_message_para);

sigparams.dwmsgencodingtype = pkcs_7_asn_encoding | x509_asn_encoding;//編碼方式

sigparams.psigningcert = pcertcontext;//簽名所用證書的上下文

sigparams.hashalgorithm.pszobjid = szoid_rsa_sha1rsa;//摘要演算法用sha1

sigparams.hashalgorithm.parameters.cbdata = null;

sigparams.cmsgcert = 1;// cryptsignmessage生成的是標準的pkcs7格式簽名,支援多使用者簽名,這裡指定簽名使用者數,也就是rgpmsgcert陣列元素個數。當然,絕大部分情況下只有乙個使用者簽名。

sigparams.rgpmsgcert = &pcertcontext;//包含所有簽名證書的陣列,必須將psigningcert指向的證書上下文物件新增到這個陣列裡

sigparams.cauthattr = 0;//使用者認證屬性陣列元素個數,也就是rgauthattr元素個數,沒有的話就傳0

sigparams.rgauthattr = null;// 使用者認證屬性陣列

sigparams的其他屬性值可以參看相關文件,一般情況下都設定為0或nul;fdetachedsignature標識簽名結果是否與原文分離,一般設定為true;ctobesigned 是待簽名原文的個數,也就是rgpbtobesigned和rgcbtobesigned的元素個數;注意,如果fdetachedsignature為false,即簽名和原文不分離的情況下,ctobesigned只能是1,也就是只能有乙個原文進行簽名;rgpbtobesigned是待簽名的原文陣列;rgcbtobesigned是待簽名原文長度的陣列;pbsignedblob為返回的pkcs7格式簽名結果,如果fdetachedsignature為true,則結果為純簽名;否則結果裡包含簽名和原文資料;pcbsignedblob是pbsignedblob的位元組長度。同樣,每一次簽名時此方法應呼叫兩次,第一次pbsignedblob傳null,pcbsignedblob返回簽名結果的實際長度,第二次呼叫時為pbsignedblob分配pcbsignedblob的位元組長度。第二次呼叫一定要用實際長度分配空間,否則即使簽名成功,驗證時也可能失敗。

方法成功返回true,失敗返回false,呼叫getlasterror可返回具體錯誤資訊。

八、 簽名驗證

根據簽名結果是否與原文分離,驗證簽名的方法也相應有兩種:

錯誤碼說明e_invalidarg(0x80070057)

資料編碼方式無效。目前只支援pkcs_7_asn_encoding和 x509_asn_encoding_type

crypt_e_unexpected_msg_type(0x8009200a)

非數字簽名。

crypt_e_no_signer(0x8009200e)

沒有未驗證的簽名了。

nte_bad_algid(0x80090008)

未知或不支援的演算法。

nte_bad_signature(0x80090006)

無效的簽名。也就是原文或(和)簽名被改動造成的驗證失敗。

cryptacquirecontext

ZooKeeper程式設計指南(四)

訪問控制 zk使用acls access control list 來控制對節點的訪問。acl實現類似於unix的檔案許可權控制 使用許可權位來 允許 禁止 對節點的各種操作和一些位的作用範圍。不像unix許可權,zk節點不受限於3個標準的範圍 使用者 owner 組,其它 world zk沒有節點...

Spark Streaming程式設計指南(四)

部署應用程式 監控應用程式 和rdd類似,dstream允許開發者將流資料持久化到記憶體。使用在dstream上使用persist 方法會自動持久化dstream中的每個edd到記憶體中。這對於dstream需要計算多次的情況非常有用 如在相同資料上進行多個操作 對於window based操作 如...

HTTP權威指南(四)

1.報文是箱子,實體是貨物 報文實體由報文首部和實體主體組成 2.content length 實體的大小 該首部指示出報文中實體主體的位元組大小 1 檢測截尾 2 錯誤的長度資訊 3 對於持久連線必不可少 4 如果進行了內容編碼,則是編碼後的位元組長度 5 確定實體主體長度的規則 http 1.1...