6.3.1 哈希

对于给定的数据块, 密码哈希与摘要会生成固定大小的位序列。 这些哈希值可以简化数据块的比较与排序。 哈希的常见使用场景包括追踪文件变更、下载校验和、数据混淆以进行数据库存储, 以及验证请求数据的完整性等。

iOS CommonCrypto 库提供了对 MD5、SHA-1、SHA-256 摘要以及其他不太常用的加密算法的支持

6.3.1 哈希_第1张图片
NSString Hashing

便捷方法 md5、shal 与 sha256 都会调用 hashWithTYpe:. 虽然 CommonCrypto 库提供了一些预定义的哈希枚举, 应用可以直接使用, 不过这些枚举都没有定义在摘要计算的上下文中。 相对于依赖未来可能会发生变化的枚举, 应用使用自定义的值可以限制支持的摘要算法, 这也是额外的好处


6.3.1 哈希_第2张图片
加密实现

hashWithType: 实现中唯一不太直接的地方就是最后一步,最后一步会循环摘要计算的字节输出, 然后将其转换为十六进制, 即可读的输出。 完成好核心的哈希逻辑并将其放到一个方法中后, 实现每个便捷方法就只需要一行代码即可, 如下


6.3.1 哈希_第3张图片
实现

这种方式的额外好处就是可以轻松扩展以支持更多的摘要计算。 下面调用每个便捷方法并显示相应的输出 (美国国家标准协会(NIST)提供了测试向量来验证摘要计算的输出, 地址 http://www.nsrl.nist.gov/testdata/):

6.3.1 哈希_第4张图片
打印加密字符

在服务层生成哈希值的过程是类似的, 因为 PHP 支持上面代码中实现的每一种摘要算法, 此外还支持一些这里没有列出的算法。 生成哈希值的标准函数是 .hash(), 它接收持执行的算法以及算法所需要的值。 此外, PHP 还提供了一些便捷函数来生 MD5 与 SHA1 哈希值。 

6.3.1 哈希_第5张图片
php 哈希

上述示例展示了如何生成字符串对象的哈希值, 不过也可以很轻松地生成 NSData 对象的哈希值, 方式是在 NSData 上创建一个类似的类别。 然而, 如果有更为复杂需求或是想在 iOS 应用中比较哈希值, 可以考虑创建自定义类, 从而优化初始化并通过重写 isEqualTo: 来简化哈希值的比较。 不过, 使用哈希算法可以检测到内容的变化, 同时消息认证码与密钥是配对的, 并且更加安全

你可能感兴趣的:(6.3.1 哈希)