zoukankan      html  css  js  c++  java
  • iOS sha1加密算法

    最近在项目中使用到了网络请求签名认证的方法,于是在网上找关于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加密>这个帖子中找到了方法,现贡献给大家

    首先需要添加头文件
    #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(安全[哈希算法])只是叫做一种算法,用于检验数据完整性,并不能叫做加密

    相关链接:

    iOS sha1加密方法(哈希算法,用于校验数据完整性)以及字符串中含有汉字的情况的加密方法

    MD5与SHA-1加密简介(附iOS加密方式)

    iOS中hmac_sha1如何解密

    iOS开发之Objective-c的MD5/SHA1加密算法的实现

  • 相关阅读:
    iPhone 移植到 iPad:
    在Xcode4 中将iPhone使用的xib转换成iPad使用的xib
    IOS7开发~Xcode5制作framework
    汇总iOS开发中需要用到的开源库
    Objective-C学习笔记 利用协议实现回调函数
    xcode 4 制作通用静态库
    (难)Codeforces Round #406 (Div. 2) D题Legacy(线段树+最短路)解题报告
    (十字链表)CodeForces
    (并查集)poj1182——食物链
    (dp)17bupt新生赛——B. Hmz 的女装
  • 原文地址:https://www.cnblogs.com/shenlaiyaoshi/p/8412847.html
Copyright © 2011-2022 走看看