• 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加密算法的实现

  • 相关阅读:
    PCB genesis方槽加内角槽孔实现方法
    PCB genesis连孔加除毛刺孔(槽孔与槽孔)实现方法(三)
    PCB genesis连孔加除毛刺孔(圆孔与槽孔)实现方法(二)
    PCB genesis连孔加除毛刺孔(圆孔与圆孔)实现方法(一)
    为什么要用Redis而不直接用Map做缓存
    Linux 查询端口被占用命令
    HashMap 和 Hashtable 的区别
    RandomAccess是什么
    接口和抽象类的区别是什么?
    为什么 Java 中只有值传递?
  • 原文地址:https://www.cnblogs.com/shenlaiyaoshi/p/8412847.html
Copyright © 2020-2023  润新知