• IOS XCode Objectc SHA256加密


    需求:

    对字符串(NSString)格式数据进行SHA256加密之后再进行Base64编码。SHA256加密生成的不是标准的占位2的十六进制格式,而是需要直接输出字节数组。

    方案:

    创建新的SecurityUtility.h以及SecurityUtility.m文件,在需要加密的字符串所在文件调用SecurityUtility.h头文件,并调用所写方法。

    实施例:

    1.SecurityUtility.h文件代码:

    #import <Foundation/Foundation.h>
    
    @interface SecurityUtility : NSObject
    
    //SHA256加密
    + (NSData*)sha256HashFor:(NSString *)input;
    
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中, 输入NSString格式数据,输出NSData格式数据(Objectc中想要生成Base64编码,需要先转换成NSData格式,因此这里直接生成NSData格式数据)
      

    2.SecurityUtility.m文件代码:

    #import "SecurityUtility.h"
    #import <CommonCrypto/CommonDigest.h>
    #import <CommonCrypto/CommonHMAC.h>
    
    @implementation SecurityUtility
    
    //SHA256加密
    + (NSData*)sha256HashFor:(NSString*)input{
        NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
        uint8_t digest[CC_SHA256_DIGEST_LENGTH];
        CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
        NSData *data1 = [[NSData alloc] initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
        return data1;
    }
    
    @end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    其中, digest为uint8_t格式,如果用unsigned char格式直接输出字符数组的话会导致输出结果每次结果不同(结果最后两位每次都会变,不清楚原因)
      

    3.调用代码:

    (1)首先需要在需要调用SHA256编码方法的文件中引入SecurityUtility头文件。

    #import "SecurityUtility.h"
    
    • 1

    其中,SecurityUtility.h为SHA256方法头文件的名称(可换其他名称)。
      
    (2)调用sha256HashFor方法

    //将image_add进行SHA256加密,输出的是字节数组,并不是标准的SHA256格式(占位2的十六进制)
    NSData *sha256_data =[SecurityUtility sha256HashFor:image_add];
    // Base64编码
    NSString *sha_result = [sha256_data base64EncodedStringWithOptions:0];
    
    • 1
    • 2
    • 3
    • 4

    其中,image_add是本文中需要加密的NSString字符串数据,sha_results是本文中最后需要的加密数据。

    注:如果需要标准的SHA256格式编码(占位为2的十六进制)可以参考下面的代码:

    1.SecurityUtility.h文件代码:

    #import <Foundation/Foundation.h>
    
    @interface SecurityUtility : NSObject
    
    //SHA256加密
    + (NSString*)sha256HashFor:(NSString *)input;
    
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中,输入是NSString格式数据,输出也是NSString数据。注意:NSString数据之后需要转换成NSData格式数据后才能进行Base64编码
      

    2.SecurityUtility.m文件代码:

    #import "SecurityUtility.h"
    #import <CommonCrypto/CommonDigest.h>
    
    @implementation SecurityUtility
    
    //SHA256加密
    + (NSString*)sha256HashFor:(NSString*)input{
        const char* str = [input UTF8String];
        unsigned char result[CC_SHA256_DIGEST_LENGTH];
        CC_SHA256(str, (CC_LONG)strlen(str), result);
        
        NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
        for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
        {
        	//输出格式:占位为2的十六进制
            [ret appendFormat:@"%02x",result[i]];
        }
        //大写
        ret = (NSMutableString *)[ret uppercaseString];
        return ret;
    }
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    其中,和输出字符数组不同的是使用unsigned char格式数据作为中间变量。
      

    3.调用代码:

    (1)首先需要在需要调用SHA256编码方法的文件中引入SecurityUtility头文件。

    #import "SecurityUtility.h"
    
    • 1

      
    (2)调用sha256HashFor方法

    NSString *sha256_data =[SecurityUtility sha256HashFor:image_add];
    //将字符串格式转换成NSData格式的二进制数据才能进行base64编码
    NSData *sha_data = [string_sha256 dataUsingEncoding:NSUTF8StringEncoding];
    NSString *sha_result = [sha256_data base64EncodedStringWithOptions:0];
    
    • 1
    • 2
    • 3
    • 4

    参考博客:

    标准格式SHA256编码
    字节数组SHA256编码

  • 相关阅读:
    自动驾驶项目 ASLAN
    Python对象的内置方法(__del__和__str__)的介绍和使用
    蓝桥等考Python组别四级003
    职场生存--赞美别人
    越跌越买!192亿大举抄底
    centos7安装mysql5.7
    机器视觉(三):摄像机标定技术
    闭包-问题大全
    WPF参考做的TextBox圆角,并且水印文字操作
    GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践
  • 原文地址:https://blog.csdn.net/qq_42440990/article/details/127981887