美文网首页
RSA-SHA1签名

RSA-SHA1签名

作者: westke | 来源:发表于2014-11-19 20:40 被阅读3627次

    初识签名认证

    讲到签名验证,作为密码学出身的我,本应该有很多要讲的,但不幸的是我记
    性不好,忘性非凡,算法的精髓 早已还给我们的老周同志了,这里也就不啰
    嗦那么多了。由于客户端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

    相关文章

      网友评论

          本文标题:RSA-SHA1签名

          本文链接:https://www.haomeiwen.com/subject/oanitttx.html