常见加密方式总结_32位数字字母加密方式是什么-程序员宅基地

技术标签: Java模块  服务器  http  ssl  

一 . 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 = @"".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)

公钥\私钥(用公钥加密,私钥解密或者用私钥加密,公钥解密)


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/swebin/article/details/121980456

智能推荐

【深度学习】RNN-程序员宅基地

文章浏览阅读6.9k次,点赞4次,收藏31次。循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。_rnn

pert计算公式期望值_练习-三点估算和PERT技术-程序员宅基地

文章浏览阅读873次。三点估算和PERT技术通过考虑估算中的不确定性和风险,可以提高活动持续时间估算的准确性。这个概念起源于计划评审技术(ProjectEvaluationandReviewTechnique,PERT)。PERT经常使用3种估算值来界定活动持续时间的近似区间,其关系如下:·最可能时间(tE)。活动的持续时间估算。项目管理论坛·最可能时间(tM)。基于最可能获得的资源、最可能取得的资源生产率..._beta pert 分布, 三点时间满足 90%概率分布,求期望时间te

MFC链接SQL Server ——学生成绩管理系统-程序员宅基地

文章浏览阅读3.3k次,点赞18次,收藏67次。MFC链接SQL Server连接数据库新建一个udl文件,服务器名称与SQL Server服务器保持一致。选择相应的数据库,测试连接。(先建好数据库)将udl文件改成txt文件。打开该文件,第3行为SQL Server数据库连接字符串。在MFC项目中添加连接代码新建基于对话框的MFC应用程序项目,按学号命名。在电脑查找msado15.dll的路径,例如:C:\Program Files (x86)\Common Files\System\ado\msado15.dll在MFC项目头文

报童问题求解最大利润_第3章 第2节 处理分类问题常用算法(二)-程序员宅基地

文章浏览阅读623次。● 分层抽样的适用范围参考回答:分层抽样利用事先掌握的信息,充分考虑了保持样本结构和总体结构的一致性,当总体由差异明显的几部分组成的时候,适合用分层抽样。● LR的损失函数参考回答: M为样本个数,为模型对样本i的预测结果,为样本i的真实标签。● LR和线性回归的区别参考回答:线性回归用来做预测,LR用来做分类。线性回归是来拟合函数,LR是来预测函数。线性回归用最小二乘法来...

springboot集成sharding-jdbc_springboot整合shardingjdbc-程序员宅基地

文章浏览阅读2.8k次。springboot集成sharding-jdbc,通过sharding-jdbc实现mysql主备分库,数据库连接池采用阿里巴巴的druid,数据库orm框架采用mybatis_springboot整合shardingjdbc

SECS/GEM实现_secs gem引用哪个using-程序员宅基地

文章浏览阅读4.1w次,点赞2次,收藏4次。SECS/GEM是半导体以及光伏行业等采用的通讯基础,在此之上进行搭建EAP,MES等管理系统。SECS/GEM使用起来会有许多注意内容,例如TCP/UDP,R232等通讯问题,以及通讯安全问题等。通讯双方认证,避免信息暴露以及后门问题等。金南瓜DMS安全,且经过大量工厂严格考验,其中不乏JECT,科瑞,三安等,在稳定性要求极高,稳定性高的SECS/GEM也带来设备的极好体验,让客户工程师使..._secs gem引用哪个using

随便推点

Java/Python/Go不同开发语言在进程、线程和协程的设计差异_线程和进程 不同的编程语言-程序员宅基地

文章浏览阅读1.5k次,点赞18次,收藏17次。在多线程项目开发时,最常用、最常遇到的问题是1,线程、协程安全2,线程、协程间的通信和控制本文主要探讨不同开发语言go、java、python在进程、线程和协程上的设计和开发方式的异同。_线程和进程 不同的编程语言

Spring Boot @PathVariable出现点号"."时导致路径参数截断获取不全的解决办法_springboot 路径参数 不支持点-程序员宅基地

文章浏览阅读4.9k次。@PathVariable出现点号"."时导致路径参数截断获取不全的解决办法时间:2015-05-28 17:59:54 阅读:756 评论:0 收藏:0[点我收藏+]标签:springmvc pathvaria 小数点 点 参数不全 1、问题 SpringMVC项目中通过下面的URL进行GET请求。当versi_springboot 路径参数 不支持点

Android与H5的交互_window['userinfo']-程序员宅基地

文章浏览阅读289次。如今H5的广泛应用,使得Android与H5交互也变得十分广泛,这篇文章就交互问题浅谈一下。 Android通过内置的控件Webview来加载H5页面。webview的应用十分简单,只有设置一下其属性即可。代码如下: webView.setVerticalScrollBarEnabled(false);webView.setHorizon_window['userinfo']

oracle正则表达式regexp_like的用法详解_oracle regexp_like \n\t\r-程序员宅基地

文章浏览阅读4.8w次,点赞6次,收藏97次。ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,REGEXP_REPLACE :与REPLACE的功能相似 它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同,..._oracle regexp_like \n\t\r

Android事件分发-来龙去脉_android drop事件分类-程序员宅基地

文章浏览阅读264次。关键词:Android、事件分发、源码剖析情境(Situation)1. 专注于移动互联网数年,作为高P的我【鼓掌】竟然对事件分发机制见招拆招,似懂非懂。不专业,没法忍。2. View树的递归嵌套逻辑让广大一线同行云里雾里,手足无措。冲突(Complication)1. 网上好多相关主题的博客,描述信息点非常多(但是ACTION_CANCEL描述很少),看完后不明觉厉。2. 事件分发主..._android drop事件分类

Git详解_git 理论-程序员宅基地

文章浏览阅读201次。版本控制是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS(就类似于自己写很多个版本一样,不断改进的版本)所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改。..._git 理论