** :
場景:只有公鑰字串(base64編碼),需驗證簽名。
環境:c++ + openssl
step1 從記憶體讀取公鑰
[cpp]view plain
copy
static
rsa* getpublickeyrsa(string strpublickey)
i++;
} strpublickey.insert(0, "-----begin public key-----\n"
);
);
bio *bio = null;
rsa *rsa = null;
char
*chpublickey =
const_cast
<
char
*>(strpublickey.c_str());
if((bio = bio_new_mem_buf(chpublickey, -1)) == null)
//從字串讀取rsa公鑰
rsa = pem_read_bio_rsa_pubkey(bio, null, null, null); //從bio結構中得到rsa結構
if(null == rsa)
; char
*ptmp = null;
ptmp = err_error_string(ulerr,szerrmsg); // 格式:error:errid:庫:函式:原因
cout << szerrmsg;
cout << "load public key fail error="
<" msg="
<< szerrmsg;
} else
return
rsa;
}
step2 開始驗證啦
[cpp]view plain
copy
static
bool
verify( string sign, string content )
// 將原串經過sha256摘要(摘要演算法根據實際使用來,此處以sha256為例)
string hash = sha256(content.c_str(),false
);
// 將待驗證簽名用base64解碼(一般給的簽名是經過base64編碼的)
string sign = base64decode((char
*)gameauthsign.c_str(), strlen(gameauthsign.c_str()));
// 此處簽名長度根據實際使用來,最好不要直接strlen(sign),可能發生截斷
intsign_len = 256;
intres = rsa_verify(nid_sha256, (
const
unsigned
char
*)hash.c_str(), strlen(hash.c_str()), (unsigned
char
*)sign.c_str(),sign_len, rsa);
if(res == 1)
else
; char
*ptmp = null;
ptmp = err_error_string(ulerr,szerrmsg); // 格式:error:errid:庫:函式:原因
cout << szerrmsg;
gdebugstream("verify error:"
<< szerrmsg);
} return
res == 1;
}
ps base64解碼,編碼 sha256摘要 都能過openssl實現
base64解碼
[cpp]view plain
copy
static
string base64decode(
char
* input,
intlength)
; if
(null == input || length <= 0 || length >= 1024)
intlen = evp_decodeblock((unsigned
char
*)decode, (
const
unsigned
char
*)input, length);
if(len >= 1024 || len <= 0)
decode[len] = '\0'
; result.resize(len);
for(
inti = 0; i < len; i++)
return
result;
}
base64編碼
[cpp]view plain
copy
static
string base64encode(
char
* input,
intlength)
; string result;
if(null == input || length <= 0 || length >= 1024)
intlen = evp_encodeblock((unsigned
char
*)encoded, (
const
unsigned
char
*)input, length);
if(len >= 1024 || len <= 0)
encoded[len] = '\0'
; result = string(encoded);
return
result;
}
sha256
[cpp]view plain
copy
static
string sha256(
const
char
* data,
bool
bhex =
true
) ;
sha256((const
unsigned
char
*)data, strlen(data), md);
if(!bhex)
return
s;
} else
return
s;
} }
另外,嘗試過php來驗證
但是讀取公鑰時總用報錯 $openssl_public_key = @openssl_get_publickey($pubkey);
error:0906d06c:pem routines:pem_read_bio:no start line
似乎是openssl_get_publickey這個api不支援只用公鑰的字串,應該讀取的是證書,但是只有公鑰字串,我也不知道如何生成證書。。
最後~希望你順利驗證通過~~~~
openssl RSA簽名和驗籤
1 近期除錯的乙個客戶端,為了防止介面請求被劫持 篡改,需通過證書對請求資料進行簽名操作,來確保請求資料的完整性 要用私鑰對資料進行rsa簽名,用的sha256withrsa,然後使用 base64 封裝簽名結果,將資料傳送到伺服器,伺服器對資料進行驗籤。2 針對伺服器返回結果資料,客戶端需要進行驗...
公鑰 私鑰 公鑰 私鑰 簽名 驗籤 說的啥?
公鑰加密,私鑰解密 私鑰簽名,公鑰驗籤 雜湊演算法,也叫做雜湊函式,是從乙個任何一種資料中建立小的數字方法,雜湊函式把訊息或者資料壓縮成摘要,有時候也叫做摘要演算法。把資料量變小,將資料的格式固定下來。常用的演算法有 md5 sha1 md5 不是一種加密演算法,是一種摘要演算法,無論多長的輸入,m...
公鑰 私鑰 公鑰 私鑰 簽名 驗籤 說的啥?
公鑰加密,私鑰解密 私鑰簽名,公鑰驗籤雜湊演算法,也叫做雜湊函式,是從乙個任何一種資料中建立小的數字方法,雜湊函式把訊息或者資料壓縮成摘要,有時候也叫做摘要演算法。把資料量變小,將資料的格式固定下來。常用的演算法有 md5 sha1 md5 不是一種加密演算法,是一種摘要演算法,無論多長的輸入,md...