Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
SHA-1是1994年修订的版本,纠正了SH一个未公布的缺陷。这种算法接受的输入文档小于2的64次方 位,产生160位的报文摘要。该算法实际的目标使得找出一个能够匹配给定的散列值的文本是不可能的计算,也就是说,如果对文档A已经计算出了散列值H(A),那么很难找到一个文档B,使其散列值H(B)=H(A),尤其困难的是无法找到满足上述条件的,而且有特定内容的文档B。SHA算法的缺点是速度比MD5慢,但是SHA的报文摘要更长,更有利于对抗野蛮的攻击!
/*
*字符串Md5加密
*/
- (NSString*)ConanMd5EncryptionStr;
/*
*字符串Sha1加密
*/
- (NSString*)ConanSha1EncryptionStr;
/*
*文件Md5加密
*/
- (NSString*)ConanMd5HashOfPath:(NSString*)path;
/*
*文件Sha1加密
*/
- (NSString*)ConanShaHashOfPath:(NSString*)path;
- (NSString*) ConanMd5EncryptionStr
{
constchar*cStr = [selfUTF8String];
unsignedchardigest[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, (CC_LONG)strlen(cStr), digest);// This is the md5 call
NSMutableString*output = [NSMutableStringstringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
for(inti =0; i
[outputappendFormat:@"%02x", digest[i]];
returnoutput;
}
- (NSString*) ConanSha1EncryptionStr
{
constchar*cstr = [selfcStringUsingEncoding:NSUTF8StringEncoding];
NSData*data = [NSDatadataWithBytes:cstrlength:self.length];
uint8_tdigest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (unsignedint)data.length, digest);
NSMutableString*output = [NSMutableStringstringWithCapacity:CC_SHA1_DIGEST_LENGTH*2];
for(inti=0; i
[outputappendFormat:@"%02x", digest[i]];
}
returnoutput;
}
- (NSString*)ConanMd5HashOfPath:(NSString*)path
{
NSFileManager*fileManager = [NSFileManagerdefaultManager];
// Make sure the file exists
if( [fileManagerfileExistsAtPath:pathisDirectory:nil] )
{
NSData*data = [NSDatadataWithContentsOfFile:path];
unsignedchardigest[CC_MD5_DIGEST_LENGTH];
CC_MD5( data.bytes, (CC_LONG)data.length, digest );
NSMutableString*output = [NSMutableStringstringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
for(inti =0; i
{
[outputappendFormat:@"%02x", digest[i]];
}
returnoutput;
}
else
{
return@"";
}
}
- (NSString*)ConanShaHashOfPath:(NSString*)path
{
NSFileManager*fileManager = [NSFileManagerdefaultManager];
// Make sure the file exists
if( [fileManagerfileExistsAtPath:pathisDirectory:nil] )
{
NSData*data = [NSDatadataWithContentsOfFile:path];
unsignedchardigest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1( data.bytes, (CC_LONG)data.length, digest );
NSMutableString*output = [NSMutableStringstringWithCapacity:CC_SHA1_DIGEST_LENGTH*2];
for(inti =0; i
{
[outputappendFormat:@"%02x", digest[i]];
}
returnoutput;
}
else
{
return@"";
}
}
因项目中涉及到校验算法,在这md5和sha1的字符串校验和文件校验都已实现。
在此感谢万能的互联网,本文仅作学习交流使用,禁止任何形式的转载和商业用途。
请勿用于商业及非法用途,如由此引起的相关法律法规责任,与我们无关!