几种加密方式介绍

一 . MD5

1.简单说明
MD5:全称是Message Digest Algorithm 5,译为“消息摘要算法第5版”效果:对输入信息生成唯一的128位散列值(32个字符)
2.MD5的特点
(1)对不同的数据加密,得到的结果是定长的,MD5对不同的数据进行加密,得到的结果都是32个字符.
(2)根据输出值,不能得到原始的明文,即其过程不可逆
(3)算法具有较好的安全性,而且免费
(4)广泛使用主要运用在数字签名、文件完整性验证以及口令加密等方面

MD5用途
    - 口令加密
    - 搜索
将几个关键字分别md5,在搜索这几个关键字的时候,不管顺序怎么样,还是会得到大致相同的搜素结果。其实就是将这几个关键字的md5值作一些特殊处理,比如相加。
    - 版权
        不同的数据 MD5 是不一样的,比如一个视频资源,放到服务器上的时候,会将md5值也放上去保存。如果是盗版的,md5值是不一样的。

3.MD5破解MD5解密网站:http://www.cmd5.com

4.如何使MD5加密更安全?
现在密码学要求:同样的算法,同样的密码明文,每次的结果不一样(密码有实效性)

第一种方式:加盐(Salt)
在明文的固定位置插入随机串,然后再进行MD5
如果盐是固定的,盐有很多人知道(服务器,前端,客户端),会被泄漏,不安全

static NSString *salt =@"fadsfdbvcxweioa43$^$^$$#@23123124";
NSString* password = [self.passField.text
stringByAppendingString:salt].md5String;

第二种方式:先加密,后乱序
先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序
第三种方式:HMAC
现在使用的比较广泛,安全级别更高,破解难度高。
但还是有风险:每次结果一致,有可能被暴力破解。
黑客模拟网络请求,不需要真实密码,也可以获取登陆权限。

给定一个密钥(这个密钥来自于服务器),对明文进行密钥拼接,并且做"两次散列" -> 得到32位结果。
NSString* password = [self.passField.text
hmacMD5StringWithKey:@"hmackey"];

上面代码 md5 的过程:使用密钥hmackey对密码加密,加密后做md5,得到32位字符串,再次使用 hmackey 加密,再md5

HMAC使用方式 :(登陆注册密码加密)
    - 注册时,向服务器索取密钥(key),服务器将密钥和用户的账户对应起来保存在数据库。
    - 客户端拿到key后保存在本地(钥匙串保存,登陆的时候需要用到这个key进行加密)
    - 切换了新的设备(换手机登录或者登录新的已有账号) 
 重新找服务器获取key,服务器根据账号给(比如qq,第一次登陆会比较慢,因为不仅要获取key,还要获取聊天信息)
eg: 用户在A设备登陆成功后,再去B设备登陆,B从本地找key找不到,就会找服务器要(如果有密码锁就等待授权,如果没有密码锁,就直接获取),服务器会根据A设备(授权)决定给不给(密码锁,也是根据这个key)
5、生成带时间戳的密码
使用时间戳,目前使用非常广泛
思路:
- 客户端注册时输入账号和原始密码,服务器会返回一个key给客户端
- 服务器将账号,key,以及hmac后的密码(EncryptPass)保存在数据库
- 客户端拿到key后,会将原始密码结合key进行一次hmac运算,生成一个加密后的密码(EncryptPass),加密后的密码再结合当前时间(这个时间要从服务器获取)再做一次md5,生成新的加密密码(finalPass)
- 客户端结合时间生产密码后,会发送请求和服务器上的密码作比较(服务器会用EncryptPass结合服务器当前时间,或者当前时间前一分钟,生产服务器的finalPass,如果这两个时间相同,就登陆成功)
- 这样根据时间来做,就算暴力破解或者模拟登陆,已经过了时效了,密码早已经变了。

(1) ------使用客户端时间生成带时间戳的密码------
(NSString *)timePassword{
//1.设置密钥key
NSString *key = @"itheima".md5String;
//2.使用密钥key对密码进行HMac
NSString *pwd = [self.passField.texthmacMD5StringWithKey:key];
NSLog(@"key = %@",key);
//3.获得当前的系统时间
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
//指定时区,真机通常需要指定时区
fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
//设置时间格式
fmt.dateFormat = @"yyyy-MM-dd HH:mm";
//格式化当前时间
NSString *dateStr = [fmt stringFromDate:[NSDate date]];
//4.用密码+ 时间 生成密码
pwd =[pwd stringByAppendingString:dateStr];
//5.返回hmac 结果
return [pwd hmacMD5StringWithKey:key];
}
NSString *password = [self timePassword];
(2) ------使用服务器时间,生成带时间戳的密码-----
(NSString *)timePassword{
//1.设置密钥key
NSString *key = @"itheima".md5String;
//2.对密钥key对密码进行HMac
NSString *pwd = [self.passField.text hmacMD5StringWithKey:key];
//3.获得当前服务器的系统时间
NSURL*url = [NSURL URLWithString:@"[http://localhost/hmackey.php](http://localhost/hmackey.php)"];
//使用同步获取时间(注意:这里要使用同步,确定先获得服务器的时间,后面的代码才能执行)
NSData *timeData = [NSData dataWithContentsOfURL:url];
//反序列化取出时间
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:timeData options:0 error:NULL];
NSString *dateStr = dict[@"key"];
//4.用密码+ 时间 生成密码
pwd =[pwd stringByAppendingString:dateStr];
//5.返回hmac 结果
return [pwd hmacMD5StringWithKey:key];
}
注意:要获得服务器时间来对密码进行hmac。
有些人手机上的时间设置会比真实的时间的快5分钟。如果是这样的,就会导致客户端获得的系统时间和服务器获得的系统时间相差几分钟。那就会导致hmac 的结果不一致,无法登录。
网络开发中,不管是网络传输还是在本地都不允许保存用户的明文隐私数据

登陆注册时密码的处理方式:
用户注册的时候服务器对密码进行了加密处理,然后保存在数据库,服务器是不需要知道用户的真实密码的。
登陆的时候客户端使用和服务器相同的加密方式,然后和服务器上加密后的密码比较,来完成登陆。

如果android端和mac端有分歧,可以在mac终端用下面命令来检验。
md5 -s "xxxxxxx"

保存密码的方式:(如果想反算原始密码)
1.NSUserDefaults
2.钥匙串访问
- 苹果的"生态圈",从 iOS7.0.3 版本开放
- 在Mac上能够动态生成复杂密码(AES 加密)
- 如果用户访问网站,记住密码,我们还可以看到记住的密码明文
- 本身的所有接口都是 C 语言的.借助三方库
二. 对称加密
*  加密和解密使用同一个"密钥"
*  密钥的保密工作就非常的重要,密钥会定期更换
经典算法
- DES  数据加密标准(用的比较少,因为强度不够).
- 3DES 使用3个密钥,对相同的数据执行三次加密,强度增强.
- AES  高级加密标准,目前美国国家安全局使用AES加密(钥匙串访问就是使用AES加密)

对称加密有两种加密方式: ECB和CBC

ECB: 电子代码本,就是将一个数据拆分为多块,然后独立加密
CBC: 密码块链,使用一个密钥和一个初始化"向量"对数据执行加密转换,能保证密文的完整性,如果一个数据发生改变,后面所有的数据将会被破坏
向量:某个方向的数量.
现代的密码学都和几何有关!因为几何(包含圆形\椭圆\球体)的变量是有规律的,但是结果是多变的

可以在终端通过命令来测试

//ECB加密
openssl enc -des-ecb -K 616263 -nosalt -in xxx.xxx -out XXX.XXX 
//ECB解密   
openssl enc -des-ecb -K 616263 -nosalt -in xxx.xxx -out XXX.XXX -d 
//查看ECB加密之后的文件
$ xxd xxx.xxx  

解释:
-des-ecb         : 使用ecb方式加密,
-K               : 密钥匙'abc'(注意:616263是16进制的)
-nosalt          : 不加盐
-in xxx.xxx      : 要加密的文件
-out XXX.XXX     : 生成的加密文件
=============================================================================
//cbc方式加密
echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
解释:
echo -n hello    :要加密的字符串‘hello’
enc -aes-128-cbc : 使用cbc方式加密
-iv 0102030405060708 :向量是‘12345678’
-K               : 密钥匙'abc'(注意:616263是16进制的)
-nosalt          : 不加盐
base64           :base64编码
提示:
1> 加密过程是先加密,再base64编码
2> 解密过程是先base64解码,再解密
三. 非对称加密(RSA)
公钥\私钥(用公钥加密,私钥解密或者用私钥加密,公钥解密)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
    雨_树阅读 2,401评论 0 6
  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    苹果粉阅读 11,496评论 5 29
  • Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 sync...
    keyu88888阅读 1,181评论 2 24
  • 太阳迟迟不肯离去 月亮枕着星星 闭上眼睛 风掀起了衣襟 头发翩翩起舞 我的一半属于太阳 心要照耀在阳光下 我的一半...
    妮妮雅阅读 182评论 3 5
  • I am too tired today. I have no Time to keep my diary. I ...
    老蛮腰阅读 178评论 0 0