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

时间: 2024-11-06 05:10:30

iOS sha1加密算法的相关文章

iOS 13、MacOS Catalina不再支持SHA-1加密算法

继网络大厂.微软及Mozilla之后,苹果周三宣布,最新操作系统iOS 13及macOS 10.15(Catalina)也将不再支持SHA-1加密算法.苹果网页公布最新iOS及macOS对信任凭证的要求.所有TLS服务器证书及发布的凭证认证机构(CA)都必须使用SHA-2哈希算法.预订今年秋天释出的行动和桌机操作系统将不再信任SHA-1签章的凭证,即不再支持使用SHA-1签章产生的HTTPS联机.任何没升级到SHA-2的TLS服务器,新iPhone及Mac计算机连接这些服务器时,将出现联机失败.

SHA-1加密算法的识别

通过SHA-1加密算法原理的介绍,会了解到SHA-1在加密的过程中,有几个固定的流程(特征),在逆向分析的过程中通过这些特征可以识别出当前使用的是SHA-1的加密算法,从而更高效的分析还原算法. 整理下SHA-1加密的几个特征: 1. 处理的数据是512位为1组,补位数据的填充方式 2. 5个初始常数 H0 = 0x67452301, H1 = 0x0xefcdab89, H2 = 0x98badcfe, H3 = 0x10325476, H4 = 0xc3d2e1f0 (4个初始常数的值为主要

如何应对SHA-1加密算法升级为SHA-256

经过权威机构证实,sha1加密算法的不安全性越来越高,sha指纹造假成本越来越低,随即微软.谷歌等IT巨头相继发布弃用sha1加密算法声明,第三方认证机构自2016年1月1日起,将全面停止签发SHA1算法的数字证书.这一切表明都表明从1995年诞生至今的SHA1算法将被SHA-256所取代. 对于SSL证书和代码签名证书用户,从颁发时间点上来说,一般2014年12月之前颁发的数字证书很有可能使颁发的签名指纹为sha1加密算法的证书,2015年1月之后,一般颁发的签名指纹为sha256加密算法的证

iOS:Objective-c的MD5/SHA1加密算法的实现

介绍: Objective-c实现MD5和SHA1算法相对还是比较简单的,可以直接调用系统的C/C++共享库来实现调用MD5即Message Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一SHA即Secure Hash Algorithm(安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数. 链接:http://m.111cn.net/art-53370.htm

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

[objc] view plain copy Objective-c实现MD5和SHA1算法相对还是比较简单的,可以直接调用系统的C/C++共享库来实现调用 MD5即Message Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一 SHA即Secure Hash Algorithm(安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数. 使用方式如下: MD5加密方

MD5和sha1加密算法

在很多电子商务和社区应用中,我们都要存放很多的客户的资料,其中包括了很多的隐私信息和客户不愿被别人看到的信息,当然好有客户执行各种操作的密码,此时就需要对客户的信息进行加密再存储,目前有两种比较好的加密算法:MD5和sha1. 这两种加密算法都属于散列加密技术.所谓散列加密就是无论输入的字符串是什么,有多大,加密后都将变成唯一的定长的加密串. 首先介绍一下MD5,MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Secu

MD5和sha1加密算法--散列加密技术 MD5:128bit的大整数

在很多电子商务和社区应用中,我们都要存放很多的客户的资料,其中包括了很多的隐私信息和客户不愿被别人看到的信息,当然好有客户执行各种操作的密码,此时就需要对客户的信息进行加密再存储,目前有两种比较好的加密算法:MD5和sha1. 这两种加密算法都属于散列加密技术.所谓散列加密就是无论输入的字符串是什么,有多大,加密后都将变成唯一的定长的加密串. 首先介绍一下MD5,MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Secu

sha1加密算法【收藏】

public static String getSha1(String str){        if (null == str || 0 == str.length()){            return null;        }        char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',                 'a', 'b', 'c', 'd', 'e', 'f'};     

SHA-1加密算法原理

SHA-1是一种能够根据上限为2^64位的消息计算出160比特的散列值的单向散列函数,它的分组及对数据的填充方式与MD5是一样的,512位为1组,填充数据时先填1,后面填0,一直填满448位,最后64位表示原始数据长度. 1. SHA-1: 填充 以Hello.这条长度为6字节的消息进行填充. Hello. = 48 65 6C 6C 6F 2E,写成二进制形式如下: 01001000 01100101 01101100 01101100 01101111 00101110 原始数据长度为6字节