初識簽名認證
講到簽名驗證,作為密碼學出身的我,本應該有很多要講的,但不幸的是我記
性不好,忘性非凡,算法的精髓 早已還給我們的老周同志了,這里也就不啰
嗦那么多了。由于客戶端app安全問題日益凸顯,我們客戶端組從上個月也
開始研究加密問題,剛開始AES加密進行了一段研究,但并沒真正用到,所以
也只是理論上的認識而已(對于我算又復習一下以前的知識)。加之無加密
需求的項目比較趕,就把密碼研究放下了。直到這次。
實踐簽名認證
最近為城城理財做一個app,由于涉及到金融,對安全的要求非常之高。拿到
他他們接口文檔,看到驗簽,有點心虛,因為以前總是研究并沒有用,不知道
調試會不會很耗時。畢竟項目工期就20天。一個星期將大部分UI界面搭建完之
后,開始調試接口,基本所有的接口都涉及到請求簽名驗證,不把這個問題解
決了,根本進行不下去。所以開始探索這個簽名認證。百度搜索了一些代碼,
各種沒用,一下浪費了一天,說浪費也不對,至少是排除了一大批不對的方案
和方法。直到晚上6點半,搜索了一下stackoverflow,隨便點了一個問題,
進去看了一下,覺得好像有點復雜,然后就直接放棄了,結束了一天的研究。
也因為被打擊了一天實在忍受不了了,就回去了。
第二天早晨,突然覺得頭天最后看到的文章應該有用,于是翻看網頁瀏覽紀錄
,找到那晚的文章,那篇文章后來我再去找,再也無法找到,也怪自己手賤,
把瀏覽紀錄刪除完了,挺后悔的。言歸正轉,就是那篇文章的下面這個方法起
到了重要作用(我已添加成NSString的一個類別方法):
- (NSString *)RSASHA1HashForString
{
OpenSSL_add_all_algorithms();
NSString *signature = nil;
// make a SHA-1 digest of the source string
const char* sourceChars = [self UTF8String];
unsigned char digest[SHA_DIGEST_LENGTH];
SHA1((const unsigned char *)sourceChars, strlen(sourceChars), digest);
NSString *path = [[NSBundle mainBundle] pathForResource:@"rsa_private_key" ofType:@"pem"];
const char *pathCString = [path cStringUsingEncoding:NSUTF8StringEncoding];
FILE *secretFile = fopen(pathCString, "r");
RSA *rsa = NULL;
PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL);
if (rsa != NULL) {
unsigned int sigLen = 0;
unsigned char *sigBuff = malloc(RSA_size(rsa));
int result = RSA_sign(NID_sha1, digest, (unsigned int) sizeof(digest), sigBuff, &sigLen, rsa);
if (result != 0) {
NSData *sigData = [NSData dataWithBytes:sigBuff length:sigLen];
signature = [sigData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
free(sigBuff);
RSA_free(rsa);
}
fclose(secretFile);
return signature;
}
當然你如果只靠我上面的代碼會死得很慘,這也是我百度的經驗,一般人從來不
寫他導入的頭文件,這讓人很郁悶,你要么不寫,要么寫全,否則幫不了別人,
給人的感覺這個人只是自己炫耀自己的知識,讓人反感。又扯遠了,馬上回來。
我導入的頭文件有下面這些:
#include <rsa.h>
#include <pem.h"
#include <ssl.h>
#include <sha.h>
#include <evp.h>
這些是openssl的文件,而支持iphone所有架構的openssl的倉,是在github
上,其地址為https://github.com/x2on/OpenSSL-for-iPhone將編譯
出來的靜態庫拖入工程,為了防止在其他電腦上報頭文件不存在的錯,最好將
openssl的頭文件也拖進工程,那么上面的頭文件的導入方式就要由<>改成"",
并且,openssl的頭文件中報沒有相關的.h文件都要將<>改成""。下面再給出調
用栗子:
NSString *sign = [@"簽名" RSASHA1HashForString];
如果有疑問請發郵件westke2010@126.com