先说一下:MD5加密可破解,每一个原密码
对应一个不变的MD5加密的密码
效果:
MD5加密demo 密码: c1j2
一.简述MD5:
- 1.MD5即Message-Digest Algorithm 5,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。(引用自百度百科)
- 2.MD5 不是一种加密算法,只是用来做文件校验的。比如官方发布一个软件,同时公布一个MD5校验码。如果你下载下来的软件,通过MD5校验后,和官方公布的不同,就说明你这个软件已经被人修改过了,不是官方原版。MD5算法都是统一的,没有密钥之类的东西。相同的字符串通过MD5转码后,都能够获得相同的MD5码。但是,MD5是一种摘要算法,是不可逆的,但是网上在线可以解密,也就是说,通过MD5值不能还原原始数据。加密,解密之类的还是用DES/AES + BASE64之类的算法来实现。
二.MD5的用法
- 1.在Objective-C中我们怎么进行MD5加密,首先我们需要包含头文件是
#import <CommonCrypto/CommonDigest.h>
digest [daɪ'dʒɛst] vt. 消化;吸收;融会贯通
crypto ['kriptəu] adj. 秘密的,隐蔽的,不公开的
- 2.其实用法跟简单,就一个调用方法(两种方法)
1.第一种
[self md5:@"要加密的东西" ]; //可以打印出来就是加密好的字符串,可以在线解密
- (NSString *)md5:(NSString *)str
{
const char *cStr = [str UTF8String];
unsigned char result[16];
CC_MD5(cStr, (CC_LONG)strlen(cStr), result); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
2.第二种
- (NSString *)md5HexDigest:(NSString*)password { const char *original_str = [password UTF8String]; unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5(original_str, strlen(original_str), result); NSMutableString *hash = [NSMutableString string]; for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { /* %02X是格式控制符:‘x’表示以16进制输出,‘02’表示不足两位,前面补0; */ [hash appendFormat:@"%02X", result[i]]; } NSString *mdfiveString = [hash lowercaseString]; return mdfiveString; }
1.char[16]和%02x的来历:
其中%02x是格式控制符:‘x’表示以16进制输出,‘02’表示不足两位,前面补0;如‘f’输出为0f,‘1f3’则输出1f3;本来一般的都会介绍到这里就完了,我想多介绍一下代码中result是个字符数组,那为什么是[16]呢,这是因为MD5算法最后生成的是128位,而在计算机的最小存储单位为字节,1个字节是8位,对应一个char类型,计算可得需要16个char。所以result是[16]。那么为什么输出的格式一定是%02x呢,而不是其它呢。这也是有原因的:因为约定MD5一般是以16进制的格式输出,那么其实这个问题就转换为把128个0和1以16进制来表示,每4位二进制对应一个16进制的元素,则需要32个16进制的元素,如果元素全部为0,放到char的数组中,正常是不会输出,如00001111,以%x输出,则是f,那么就会丢失0;但如果以%02x表示则输出结果是0f,正好是转换的正确结果。(摘抄)
2.对于16位MD5加密的解释
至于人们说的16位MD5加密,其实是这样的:举例如果产生的MD5加密字符串是:01234567abcdefababcdefab76543210,则16位的MD加密字符是abcdefababcdefab,也就是只是截取了中间的16位。实际上这个操作已经不是MD5加密算法所包括的,而应当是对MD5加密算法结果的二次处理。其它的64位和大小写什么的,都属于对MD5算法结果的二次处理。因为MD5算法产生的结果就是128bit,128个二进制数字。
三.简单介绍一下加密
* 1、简单的概念 明文:加密前的信息 密文:机密后的信息 加密算法:加密或解密的算法 密钥:算法使用的钥匙(读作miyao,正确应该是miyue,但是大家都读miyao) * 简单的例子 将123456每位数字都加1后得到234567, 其中123456就是明文,234567就是密文,加密密钥就是1,加密算法是每位加 * 2、加密算法种类 按照加密的方式我们可以将加密算法大体分成一下三种: * 对称加密算法(加密和解密算法是对称的可能有点抽象你可以理解成同一把钥匙) * 非对称加密算法(加密和解密算法是非对称的可以理解成加密的时候是一把钥匙解密的时候是一把钥匙,典型的就是rsa公钥和私钥) * 经典哈希算法(哈希算法是一种散列算法,有个特殊性是它是不可逆只能通过穷举法超大量的计算才可能算出,一般几率很小,还有就是你同一段的明文两次加密出来的结果是不一样的) * * 3、算法举例 * 对称加密算法:DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法,AES算法。 * 非对称加密算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC。 * 经典的哈希算法:MD2、MD4、MD5 和 * * SHA-1(目的是将任意长输入通过算法变为固定长输出,且保证输入变化一点输出都不同,且不能反向解密) * 4、 今天我们来说一下我们在来发中常用的算法暂时只讲:MD5、Base64、sha、AES、rsa * 补充:RSA加密算法中比较重要的加密算法 * 非对称加密算法可能是世界上最重要的算法,它是当今电子商务等领域的基石。简而言之,非对称加密就是指加密公钥和解密密钥是不同的,而且加密公钥和解密密钥是成对出现。非对称加密又叫公钥加密,也就是说成对的密钥,其中一个是对外公开的,所有人都可以获得,人们称之为公钥;而与之相对应的称为私钥,只有这对密钥的生成者才能拥有。 * 对于一个私钥,有且只有一个与之对应的公钥。公钥公开给任何人,私钥通常是只有生成者拥有。公/私钥通常是1024位或者2048位,越长安全系数越高,但是解密越困难。尽管拿到了公钥,如果没有私钥,要想解密那几乎是不可能的,至少现在在世界上还没有人公开出来说成功解密的。 * 5. 先移动端给服务器传递通过RSA公钥加密后的数据,参数包括DES的密钥(密钥是随机生成的八位字符串) 和 相关参数信息,服务器通过私钥解密信息数据,里面包括DES密钥和 相关参数信息,服务器再通过此DES密钥加密返回数据给移动端,移动端通过此DES密钥进行解密获取数据。 * 优点:因为RSA不容易解密,即使被拦截解密了,获取了DES的密钥,因为DES的密钥是随机生成的,也只能解密这一次的数据信息,不会对其他数据信息产生影响。(注:DES的密钥每一次都要重新随机生成,也就是一个密钥只完成这一次的数据传递) * 总结:公钥和密钥成对出现,其中公钥负责加密 ,私钥负责解密 * */
四.在线的加密和解密
- 1 MD5在线加密
2 MD5解密
- 3 MD5加密和解密