密码学HASH与对称加密

HASH概述:

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

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。2004年,证实MD5算法无法防止碰撞(collision)(如网站:CMD5),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

MD5是哈希算法的一种。

Hash的特点:

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

Hash的用途:

  • 用户密码的加密:服务器没有必要保存用户的真实密码,只是保存密码的哈希值,防止用户密码被泄露,业务上一般也只有重置密码功能,没有找回密码功能

  • 搜索引擎:是将关键字的哈希值相加,进行匹配的,因为分别都是128位的二进制,不管怎么排列组合,相加过后的结果都是一样的。这样搜索
    的时候,哪怕关键字顺序不一样,搜索的结果也是一样的。

  • 版权:正版的哈希值和盗版的哈希值是不一样的。因为哈希值是根据二进制数据来哈希的,只有二进制改变,如压缩,哈希值才能改变,复制并不会改变哈希值。

  • 百度云:有秒传功能,是因为传递的时候,他会在云上匹配哈希值,如果有哈希值一样,并且后缀名那些也一样的话,就不用再传了。

  • 数字签名:客户端将原始数据和原始数据哈希值过后RSA加密过后的密文一起传给服务器,服务器将密文解密过后得到哈希值,并与传过来的原始数据哈希过后的哈希值进行匹配,如果匹配原始数据就是没有被篡改过。如果不匹配就是被篡改过了。用RSA包装的原始数据哈希值的过程,叫做数字签名

密码加密

密码加密常见的有以下几种方式:

  • 直接使用MD5:不安全,直接使用MD5可以通过MD5碰撞,破解出密码
  • MD5加盐:当盐泄露过后,也就不安全了
  • HMAC加密方案:比较好的加密方案,简单来说是使用一个密钥加密,并且做了两次散列,在实际开发中,密钥来自于服务器,并且每个账号匹配一个
  • HMAC加密方案并添点东西(如时间戳等):当使用HMAC加密方案过后,再添点东西进行哈希

HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。

HMAC的应用
image.png

如上图中,共有两个流程:

授权设备登录流程:
1、输入账号过后,就把账号作为参数向服务器发送请求
2、服务器根据账号生成对应的key,并传递给客户端
3、客户端拿到key,进行HMAC运算,并将运算结果的哈希值传给服务器

其他设备登录流程:
1、输入账号过后,在本地缓存中找服务器传过来的key,有就登录,没有就把账号作为参数向服务器发送请求
2、服务器要先看这个账号是否开启了设备锁,没有开启就不允许登录,开启了,就向授权设备发送请求,是否授权,如果授权,就将这个账号的key传给其他客户端
3、客户端拿到key,进行HMAC运算,并将运算结果的哈希值传给服务器

但是在这之中有一个潜在的安全隐患问题:当别人拿到账号和传递的哈希值过后,也就能拿到登录权限,从而不安全。

所以这个时候不仅需要HMAC加密,还需要添点东西了,如下:


image.png

为了防止上面的问题,注册流程不变,服务器还是保存的有加了key的HMAC哈希值。
1、只是登录的时候,客户端将哈希值与时间戳拼接过后,进行MD5加密,再传给服务器。
2、服务器将注册保存的账号对应的HMAC哈希值,分别与当前时间,和前一分钟拼接再MD5加密,再和客户端传过来的进行匹配,匹配成功则登录成功,否则不成功。
3、注意这里的时间戳是服务器给的时间戳。

注意:
关于密码安全还需注意的是密码和指纹,人脸的关系:
密码:你是这个账号的主人!
人脸、指纹:你是这个手机的主人!
支付宝那些是登录成功过后,开通指纹识别

对称加密

常见的加密算法:

  • DES 数据加密标准(用得少,因为强度不够)
  • 3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
  • AES 高级密码标准(一般都用这个,苹果的钥匙串访问等)AES 加密算法的原理详解

应用模式:

  • ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。

    • 最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
  • CBC(Cipher Block Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。

    • 明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。

    • CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。

加密的终端命令:
  • DES加密的ECB模式下,将message.txt加密,输出为msg1.bin
    $ openssl enc -des-ecb -K 616263 -nosalt -in message.txt -out msg1.bin

  • DES加密的CBC模式下,将message.txt加密,输出为msg3.bin
    $ openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -in message.txt -out msg3.bin

  • AES(ECB)加密“hello”字符串
    $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
    AES(ECB)解密
    $ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d

  • AES(CBC)加密“hello”字符串
    $ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
    AES(CBC)解密
    $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d

加密过程是先加密,再base64编码
解密过程是先base64解码,再解密

CCCrypt函数

AES加密解密都是用到的CCCrypt函数,并且需要导入CommonCrypto框架。

 /**
     1、kCCEncrypt 加密/kCCDecrypt 解密
     2、加密算法。
     3、加密选项:ECB/CBC
     4、加密的密钥
     5、密钥的长度
     6、iv 初始化向量
     7、加密的数据
     8、加密的数据长度
     9、密文的内存地址
     10、密文缓冲区的大小
     11、加密结果大小
     */
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          self.algorithm,
                                          option,
                                          cKey,
                                          self.keySize,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &encryptedSize);
    ```
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容