iOS 使用HMAC

iOS 使用HMACHMAC 是在 MD5 SHA1 SHA256 等的基础上发展 加入 key 进行计算摘要 摘要的算法是散列摘要的长度对于一个算法来说是固定的对于我们平常编程来说 摘要是唯一的 只要数据不一样摘要就会不一样理论上摘要的散列算法会发生散列碰撞 即两个数据的摘要是一样的 可以想一下 既然摘要有一个固定长度 那么它就会有一个表示的最大数据量 但是数据是无限的 比如数字 1 到 所以摘要一定会发生散列

HMAC 是在MD5、SHA1、SHA256等的基础上发展,加入key进行计算摘要。摘要的算法是散列

摘要的长度对于一个算法来说是固定的

对于我们平常编程来说,摘要是唯一的,只要数据不一样摘要就会不一样

理论上摘要的散列算法会发生散列碰撞,即两个数据的摘要是一样的,可以想一下,既然摘要有一个固定长度,那么它就会有一个表示的最大数据量,但是数据是无限的(比如数字1到∞)。所以摘要一定会发生散列碰撞。(在我们应用摘要的时候,散列碰撞忽略就可以)

我们的应用中用到的摘要是用于验签,即验证服务器返回的数据是否被修改,当然我们加入了RSA和AES加密保证数据不会轻易被解开

之前的摘要有用于登录的过程,HAMC也有用于该过程的,HMAC用于登录可以实现类似设备锁的功能。

之前说过HMAC需要一个KEY,这个KEY在注册的时候分配给用户,用户存储到本地(当然需要本地做一些处理,防止被其他人获取到),以后无特殊情况不会变动。

当用户登录的时候,检查本地是否存在KEY,如果存在直接发起登录,否则向服务器请求KEY。

PS:用户向服务器请求KEY,服务器不一定就要给,服务器要先确定该账号是否开启设备锁,如果开启,向原始设备发送授权请求,否则直接返回KEY。

当拿到KEY的时候登录

这是设备锁的简单流程,当然还需要做一些其他的操作来保证安全问题。例如本地存储的加密、传输通道的加密等。

好了,大体介绍就完成了,现在来看一下HMAC的代码

HMAC使用iOS系统提供的HMAC算法

void CCHmac(

    CCHmacAlgorithm algorithm,  /* kCCHmacAlgSHA1, kCCHmacAlgMD5 */

    const void *key,

    size_t keyLength,           /* length of key in bytes */

    const void *data,

    size_t dataLength,          /* length of data in bytes */

    void *macOut)               /* MAC written here */

    __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);

几种不同的HMAC算法只有参数 algorithm 不同,其它都差不多

例如HMACMD5的

+ (NSString *)LJHMACMD5:(NSString *)data key:(NSString *)key { NSData *datas = [data dataUsingEncoding:NSUTF8StringEncoding]; size_t dataLength = datas.length; NSData *keys = [key dataUsingEncoding:NSUTF8StringEncoding]; size_t keyLength = keys.length; unsigned char result[CC_MD5_DIGEST_LENGTH]; CCHmac(kCCHmacAlgMD5, [keys bytes], keyLength, [datas bytes], dataLength, result); for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++) { printf("%d ",result[i]); } printf("\n-------%s-------\n",result); //这里需要将result 转base64编码,再传回去 //为了简单这里没有做 NSString *base64 = [NSString stringWithUTF8String:result]; //因为没做base64编码,所以result转NSString 转换失败,是NULL return base64; }

HMACSHA1的

+ (NSString *)LJHMACSHA1:(NSString *)data key:(NSString *)key { NSData *datas = [data dataUsingEncoding:NSUTF8StringEncoding]; size_t dataLength = datas.length; NSData *keys = [key dataUsingEncoding:NSUTF8StringEncoding]; size_t keyLength = keys.length; unsigned char result[CC_SHA1_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA1, [keys bytes], keyLength, [datas bytes], dataLength, result); for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i ++) { printf("%d ",result[i]); } printf("\n-------%s-------\n",result); //这里需要将result 转base64编码,再传回去 //为了简单这里没有做 NSString *base64 = [NSString stringWithUTF8String:result]; //因为没做base64编码,所以result转NSString 转换失败,是NULL return base64; }

都差不多,系统帮我们实现了内部的算法,系统的算法还有很多,如DES、AES等。

最后附上一个demo,demo地址

http://download.csdn.net/download/u0/




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225016.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午10:19
下一篇 2026年3月17日 上午10:20


相关推荐

  • 新安装idea,需要设置好的几个地方。

    设置编码格式。 设置maven。 如果不设置,那之前下载的jar包还得重新下载。 设置快捷键。 我使用eclipse的快捷键。 设置主题。 设置字体。 设置JDK. 未完待续。。。。。。

    2022年3月13日
    72
  • 激光雷达(二)——三角测距法和TOF原理

    激光雷达(二)——三角测距法和TOF原理对于市面上的主流激光雷达,主要是用于环境探测、地图构建,按技术路线可分为:三角测距激光雷达,TOF激光雷达。三角测距激光雷达原理三角法的原理如下图所示,激光器发射激光,在照射到物体后,反射光由线性CCD接收,由于激光器和探测器间隔了一段距离,所以依照光学路径,不同距离的物体将会成像在CCD上不同的位置。按照三角公式进行计算,就能推导出被测物体的距离。CCD是ChargeCoupled…

    2022年6月2日
    72
  • 机器学习十大算法!入门看这个就够了~

    机器学习十大算法!入门看这个就够了~基本的机器学习算法 线性回归算法 LinearRegres 支持向量机算法 SupportVecto SVM 最近邻居 k 近邻算法 K NearestNeigh KNN 逻辑回归算法 LogisticRegr 决策树算法 DecisionTree k 平均算法 K Means 随机森林算法 RandomForest 朴素贝叶斯算法 NaiveBayes 降维算法 DimensionalR 梯度增强算

    2026年3月16日
    2
  • FGC 2012

    FGC 2012JournalSpecialIssuesDistinguishedselectedpapersacceptedandpresentedinFGC2012,afterfurtherextensionandrevisions,willbepublishedinspecialissuesofthefollowingprestigiousSCI-Inde

    2022年6月19日
    34
  • 【C++】智能指针详解

    【C++】智能指针详解参考资料:《C++Primer中文版第五版》我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delet…

    2022年7月11日
    31
  • 基础——SPI与QSPI的异同,QSPI的具体协议是什么,QSPI有什么用

    基础——SPI与QSPI的异同,QSPI的具体协议是什么,QSPI有什么用目录 1 QSPI 是什么 1 QSPI 是什么 SPI 协议其实是包括 StandardSPI DualSPI 和 QueuedSPI 三种协议接口 分别对应 3 wire 4 wire 6 wire 1 通常我们说的 SPI 就是 StandardSPI 有 4 根信号线 分别为 CLK CS MOSI 和 MISO 数据线工作在全双工 2 DualSPI 它只是针对 SPIF

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号