浅谈Hash

image.png

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。(来源百度百科解释)

Hash的特点

  • 算法是公开的
  • 对相同数据运算,得到的结果是一样的
  • 对不用数据运算,如MD5得到的结果都是32个字符长度的字符串
  • 这玩意没法逆运算

Hash的运用场景

通过它的这几个特点.我们可以谈谈Hash它的运用场景了

登陆密码加密

我们在开发的过程中首次登陆需要向服务器发送用户密码进行账户验证.但是用户的密码是非常隐私的信息.所以一定要使用加密保护.

直接使用Hash

那么目前最优的解决方案就是使用密码的Hash值进行验证
客户端
直接将用户输入的密码进行Hash运算,得到结果发送给服务器验证.因为Hash算法无法逆运算,所以就算Hash值泄露,用户真实密码也不会泄露.
服务端
需要服务器配合,在用户注册的时候,服务端的数据库中保存的就是用户密码的Hash值,而不是密码本身(根据Hash的特点,对相同的数据加密结果是一样的).这样就算服务器被攻克,用户的隐私信息也能起到一定的保护.

也就是现在为什么各类产品只提供重置密码的功能,而不再有找回密码的功能了.因为服务端本身也不知道用户的真实密码.

特别说明:用户的密码属于非常隐私的信息.因为大多数用户有一个特点.密码喜欢使用重复的.如果你的APP泄露了用户的密码.那么很有可能,黑客利用用户的手机号码加上密码,可以套出用户的支付信息.这种后果是非常严重的!

再加一点东西

上面所说的案例理论上已经非常的"安全"了.因为就算黑客知道了你的Hash值,也没法逆运算出用户的密码.但情况并不乐观.我们眼见为实!
以MD5为例:在终端上演示一下(比如我的密码是123456)

$md5 -s "123456"

MD5的结果是: e10adc3949ba59abbe56e057f20f883e
接下来隆重介绍一个网站http://www.cmd5.com/
我们只需要将Hash值进行反向的查询.

查询结果图

可能你会问,Hash既然不能反算为何这个网站能够查询出来?仔细看下网站的介绍不难发现:其实它是一个巨大的数据库.利用明文和Hash的数据记录,进行反向查询.

网站介绍

当然,提供哈希反向查询服务的不仅仅只有这个网站,还有很多盈利性的公司提供有偿服务.
所以如果我们单纯的直接使用Hash算法,用户的密码安全性会非常低.
早期的解决方案加盐

//用户密码
NSString * pwd = @"123456";
//足够复杂 足够长!!
static NSString * salt = @")@#(*URJ(@FJ_(@JF_(IJEFIOJ_@(IJWD{OIJW_(DIJ!W";
//先将明文拼接一个盐
pwd = [pwd stringByAppendingString:salt];
//再进行Hash算法
const char *str = pwd.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, (CC_LONG)strlen(str), buffer);
NSMutableString *md5Str = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [md5Str appendFormat:@"%02x", buffer[i]];
 }

这种方式,对于反向查询来说就比较困难了.安全系数也相对较高.

HMAC(Hash-based Message Authentication Code)

对于简单的使用盐的方式还是会有安全隐患,因为如果盐被泄露了.那么整个项目将陷入被动.因为这种方式将盐写死在程序里面了,要想今后换掉是非常难的.
那么接下来介绍一种加密方案HMAC.它使用一个密钥,并且做了两次散列!

注意:在开发过程中,这个密钥KEY是从服务器获取的.并且一个用户对应一个KEY

废话不多说,直接上代码

//用户密码
NSStirng * pwd = @"123456";
//加密用的KEY,注意是从服务器获取的
NSString * key = @"hmackey";
//转成C串
const char *keyData = key.UTF8String;
const char *strData = pwd.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
//hmac加密
CCHmac(kCCHmacAlgSHA1, keyData, strlen(keyData), strData, strlen(strData), buffer);
NSMutableString *hmacStr = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [hmacStr appendFormat:@"%02x", buffer[i]];
 }

对于这种加密方案.就可以很好的保护用户的隐私信息.因为就算泄露了KEY.这个KEY也只是一个用户的.不会污染整个项目.
如果拿到这个KEY,然后想反查询出用户的明文密码.这个成本,除非这是马云的账户.

所谓安全,无法做到绝对安全.他们灰产有句话:只要钱到位,没有什么不可能!我们要做到的就是相对安全.让破解的成本大于破解的利润.

登录加密补充

今天写得开心.所以再分享一点干货.
刚才我们一直停留子在黑客想要拿到用户的真实密码.那么如果黑客换了一个思路.大哥就是想要拿到用户的登录权限呢?
那么我们这种加密.无论你怎么玩.妥妥的都是给服务器一个Hash串进行验证啊,也就是我只需要拿到你的Hash值.那么我只要模拟你客户端进行登录是再简单不过了.
当然,这样的防护手段有很多.我介绍一种有效的防护方式.有更好的建议可以留言写在下面,一起交流,向您学习.
注册的过程
注册的过程还是一样.服务器保存的还是一串HMAC加密之后的HASH值.进行校验.但是登录时的验证做点修改.
客户端

  • 通过服务器的KEY进行HMAC加密,得到HMAC的Hash串
  • 将得到的Hash串拼接一个时间字符串@'201807102248'注意只到分(当然根据你的情况可以到秒)
  • 然后将这个拼接完成的串,再次Hash.将这个结果发给服务器验证

服务端
服务器保存了hmac的Hash串,以同样的算法,拼接服务器的时间,进行运算,然后校验.比如时间是59秒99发送的请求.服务器正好跳过一个分钟.过程如下:

  • (服务器的Hash串+@"201807102249")Hash.这次不通过再来一次
  • (服务器的Hash串+@"201807102248")Hash.和上一分钟对比,一次通过算成功

这样的好处,可以做到每登录发送给服务器的Hash值是不一样的.黑客不能通过保存Hash值模拟登录.

image.png

版权&文件识别

当然Hash的作用除了用于登录密码加密以外.还有版权的运用.
比如如何识别一段视频或者一段音频,这种数字文件是正版的.这个时候,我们使用肉眼是没法判断的.因为翻录的视频和音频文件几乎看不出来.但是,文件的二进制不一样,它的Hash值是不会欺骗群众的.所以类似YouTube这样的网站,在你上传视频的时候,它会将文件的Hash值保存.当其他的网站上传这个视频,那么看是否是正版,就是对比文件的Hash值.
既然可以识别文件.那么还有一个非常广泛运用的就是像百度云这样的云端服务.举个例子:
很多小伙伴保留的视频,经常被"和谐".有的人将视频的名称全部改为葫芦兄弟,黑猫警长但是还是被和谐了.
百度识别你的视频文件,和你的文件名称,以及文件后缀(有人改成.txt)没有半毛钱关系.它只会看这个文件的Hash值.那么如果想要逃脱.你唯一的出路就是改变文件原有的二进制.(翻录\视频格式转换).

那么最简单的,就是一个压缩包,全部搞定.(我是很严肃的在讨论技术... ...的运用场景)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,019评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,034评论 1 32
  • 这里先简单介绍单向散列函数、消息摘要和哈希碰撞的的概念 单向散列函数: 将任意长度的信息转换为较短的固定长度的值,...
    坤_7a1e阅读 3,360评论 0 0
  • 小谷爸爸, 满心期待你归来的瞬间。等不及,今天请爸妈把我和小谷送回来。想把家收拾得美美暖暖的,等你。 ...
    自然而冉111阅读 936评论 1 5