RSA-SHA1簽名

初識簽名認證

講到簽名驗證,作為密碼學出身的我,本應該有很多要講的,但不幸的是我記
性不好,忘性非凡,算法的精髓 早已還給我們的老周同志了,這里也就不啰
嗦那么多了。由于客戶端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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,432評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,969評論 19 139
  • 如果你覺得一件事很重要,自己的惰性又不想去堅持的話,請你好好強迫自己,因為,你以后感謝的,將會是你自己當初的堅持。...
    365顆荔枝閱讀 472評論 0 8
  • 秋收.憶往事 徐 宏 桃花古村暫宿留,小鳥枝頭春意鬧。 鄉間喜事迎客出,回首往事已三秋。 ...
    sunxuhong閱讀 416評論 0 1
  • 今年7月,一位來自在線短租軟件“螞蟻短租”的房東,將位于杭州的一套婚房出租給一對年輕夫妻。6天后卻發現家中被“洗劫...
    whoogaoqiao閱讀 503評論 0 0