iOS sha1加密方法(哈希算法,用于校验数据完整性)以及字符串中含有汉字的情况的加密方法
来源:互联网 发布:gddr5x和hbm2知乎 编辑:程序博客网 时间:2024/06/06 21:45
最近在项目中使用到了网络请求签名认证的方法,于是在网上找关于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(安全[哈希算法])只是叫做一种算法,用于检验数据完整性
,并不能叫做加密
0 0
- iOS sha1加密方法(哈希算法,用于校验数据完整性)以及字符串中含有汉字的情况的加密方法
- 【Android数据加密与完整性校验之使用MessageDigest类进行MD5/SHA1】校验数据传输的完整性常用方式
- 【Android数据加密与完整性校验之使用MessageDigest类进行MD5/SHA1】MessageDigest类对文件或字符串生成加密摘要进行完整性校验(一)
- 【Android数据加密与完整性校验之使用MessageDigest类进行MD5/SHA1】MessageDigest类对文件或字符串生成加密摘要进行完整性校验(三)
- Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)
- Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)
- Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)
- Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)
- iOS中隐私数据进行加密的方法
- IOS数据加密保存的方法
- LoadRunner中调用SHA1算法加密字符串
- 【Android数据加密与完整性校验之使用MessageDigest类进行MD5/SHA1】MessageDigest简介(二)
- sha1加密方法
- sha1加密工具方法
- 关于IOS 中RSA加密的方法
- C#加密方法汇总(SHA1加密字符串,MD5加密字符串,可逆加密等)
- C#加密方法汇总(SHA1加密字符串,MD5加密字符串,可逆加密等)
- 大神提供的C++ SHA1,为了能够加密字符串,我加了两个方法
- Javascript严格模式
- 键盘类型
- Android高级开发必读书单
- CodeIgniter-Security的CSRF hash生成功能
- HTML JS转义字符
- iOS sha1加密方法(哈希算法,用于校验数据完整性)以及字符串中含有汉字的情况的加密方法
- Guava Cache 缓存数据被移除后的监听器RemovalListener
- curl命令上传下载文件
- vs中无法加入断点进行调试的解决方案
- js延迟加载方式
- AJAX的学习笔记
- sql 聚合函数 sum 消息 8115,级别 16 将 expression 转换为数据类型 int 时出现算术溢出错误。
- setObjectForKey: object cannot be nil (key: UIImagePickerControllerOriginalImage)
- Android 存储使用参考