iOS密码学-Hash

129 阅读2分钟

  日常开发中,我们经常会用到求某个数据的哈希值,对给服务器传一段数据时,会给该数据进行加密。那我们有没有想过什么是哈希(Hash),哈希是不是加密呢,哈希加密之间有什么关系呢?

哈希的定义

  Hash,字面意思就是散列,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

哈希的特点

  • 算法是公开的
  • 对相同数据运算,得到的结果是一样的
  • 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)
  • 哈希得到的结果,没法做逆运算
  • 哈希值也称为信息摘要,信息“指纹”,常用来做数据识别的

哈希的用途

  • 项目开发中我们经常用到对用户的密码求哈希值进行密码加密
  • 搜素引擎里面的数据检索也会用到哈希
  • 数据的版权信息也会用到哈希
  • 数字签名   总结:Hash不是真正意义上的加密,它是一种散列碰撞的算法。对数据求哈希值,是可以通过一些网站反查询到的,所以与服务器传递密码,采用传Hash值的方式也不是很安全。那么如何才能真正的做到密码的传递绝对的安全呢?

HMAC加密方案

1、先通过RSA的加密方式先从服务端请求一个key,并保存到本地(最好放到钥匙串)
2、将key和密码按一定规则做拼接并求Hash值
3、将上一步的Hash值拼接上当前时间戳再求Hash值,登陆的时候传递密码只需要传递此Hash值。因为服务端已经保存过了设置密码时保存的密码Hash值,服务端通过验证收到请求的上一分钟和此时的Hash值。

数字签名

1、原始数据进行Hash
2、使用RSA加密hash值(这部分数据就是数据的签名信息)
3、将数据+数字签名一起打包发送传递