美文网首页ios 进阶ios 知识小集iOS 开发进阶干货
iOS sha1加密方法(哈希算法,用于校验数据完整性)以及字

iOS sha1加密方法(哈希算法,用于校验数据完整性)以及字

作者: 杏仁丶 | 来源:发表于2015-11-10 17:21 被阅读3764次

    最近在项目中使用到了网络请求签名认证的方法,于是在网上找关于OC sha1加密的方法,很快找到了一个大众使用的封装好的方法,以下代码便是

    首先需要添加头文件
    #import<CommonCrypto/CommonDigest.h>
    然后直接使用下面的方法就可以了
    //sha1加密方式
    - (NSString *) sha1:(NSString *)input
    {
        const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
        NSData *data = [NSData dataWithBytes:cstr length:input.length];
        
        uint8_t digest[CC_SHA1_DIGEST_LENGTH];
        CC_SHA1(data.bytes, (unsigned int)data.length, digest);
        NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
        
        for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
            [output appendFormat:@"%02x", digest[i]];
        }
        return output;
    }
    

    我直接在项目中使用了这个方法,而且完美解决问题,但是,今天重点说的是这个但是,在后期的项目修改中,需要加密的字符串里面增加了汉字(之前需要加密的字符串中无汉字),在这种情况下,上面的方法就和服务器那边的加密不一样了(艰难的调试排除问题的过程不赘述);

    最终发现的原因就是我这边生成的加密字符串服务器那边生成的不一样,自然就会发生错误;错误的原因就是因为加密的字符串中包含有汉字
    然后是在网上查找,在<[主题:如何对中文字符串进行sha1加密][id]>这个帖子中找到了方法,现贡献给大家
    [id]:http://www.cocoachina.com/bbs/read.php?tid=263440&page=e&#a

    首先需要添加头文件
    #import<CommonCrypto/CommonDigest.h>
    然后直接使用下面的方法就可以了
    //sha1加密方式
    - (NSString *) sha1:(NSString *)input
    {
        //const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
        //NSData *data = [NSData dataWithBytes:cstr length:input.length];
        
         NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
        
        uint8_t digest[CC_SHA1_DIGEST_LENGTH];
        
        CC_SHA1(data.bytes, (unsigned int)data.length, digest);
        
        NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
        
        for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
            [output appendFormat:@"%02x", digest[i]];
        }
        
        return output;
    }
    

    可以看出这个方法与第一个方法的区别,头两句注释掉了,用

     NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
    

    代替了那两句的作用;

    帖子一楼bindbasic的原话是这样的

    用上面的方法中文字符串转data时会造成数据丢失,
    把
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];  
        NSData *data = [NSData dataWithBytes:cstr length:input.length]; 
    
    这两句改成
    
    NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
    就可以了
    
    

    经实测,第二种方法的加密方式适用于纯字符串以及带有中文的字符串,推荐使用,推荐使用,推荐使用!!!(重要的事情说三遍)

    备注:严格来说,sha1(安全[哈希算法])只是叫做一种算法,用于检验数据完整性,并不能叫做加密~感谢2楼的指点

    相关文章

      网友评论

      • 7a946bf5d2ca:好文章
      • MMR无与伦比:这个是字符串的hash,作者知道如何计算文件的hash值吗?
      • SuperRoot:你好,请问有没有Demo,
        你这个只有加密,没有解密,我在APP里怎么使用,展示加密后的就是乱码了,
        我要针对字符串一个一个加密吗,是不是有点麻烦
        杏仁丶:@SuperRoot 不是,我当时记录这个主要是针对验签的功能;关于加固,当时有做关于SDK的加固,搜了好多资料,主要的有第三方公司的付费加固功能和方法名的混淆,不知道你上面你说的“像代码混淆,字符串混淆或加密”你都用了哪些?我对这方面也挺好奇的
        SuperRoot:@杏仁丶 主要是APP项目的加固:像代码混淆,字符串混淆或加密等各种保护app,防止被反编译,被二次打包等,看你的文章以为是对全项目字符串加密的,防止别人反编译
        杏仁丶:一般用于sha1处理的都是用来生成验签的,用来检验数据的完整性,不做解密操作,我也没有研究过sha1解密的方面;不太清楚你这边具体的需求是什么?你可以先说下你这边具体的业务需求,我看看我做过没有
      • 超_iOS:sha256有研究么
        杏仁丶:@_超 还没有
      • 492b9b7cf804:这个具体是用在哪里呢 ?
        Mr_程序员:@一个帅气网名 比如密码的“加密”传输、存储
        492b9b7cf804: @杏仁丶 就是有哪些使用场景呢?
        杏仁丶: @一个帅气网名 额,就是项目里有用,就记录下来了
      • ddaa8dae50b0:sha1是用来校验数据完整性的, 不叫加密, 是哈希算法.

        能通过非暴力算法还原出明文的算法才叫加密.
        SDBridge:@Ian_He "能通过非暴力算法还原出明文的算法才叫加密." 这叫解密吧
        杏仁丶:@Ian_He 谢谢您的指点,涨姿势了,之前做的时候也是知道这个不能还原出明文的,但是看网上都这么叫,所以叫法方面就没太注意;我会添加备注的,谢谢~

      本文标题: iOS sha1加密方法(哈希算法,用于校验数据完整性)以及字

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