Message Digest Algorithm MD5(中文名為消息摘要算法第五版)為計(jì)算機(jī)安全領(lǐng)域廣泛使用的一種散列函數(shù),用以提供消息的完整性保護(hù)霉猛。該算法的文件號(hào)為RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致。是計(jì)算機(jī)廣泛使用的雜湊算法之一(又譯摘要算法只冻、哈希算法)轩端,主流編程語(yǔ)言普遍已有MD5實(shí)現(xiàn)。將數(shù)據(jù)(如漢字)運(yùn)算為另一固定長(zhǎng)度值吃挑,是雜湊算法的基礎(chǔ)原理,MD5的前身有MD2街立、MD3和MD4舶衬。
MD5算法具有以下特點(diǎn):
1、壓縮性:任意長(zhǎng)度的數(shù)據(jù)赎离,算出的MD5值長(zhǎng)度都是固定的逛犹。
2、容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易梁剔。
3虽画、抗修改性:對(duì)原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕只修改1個(gè)字節(jié)荣病,所得到的MD5值都有很大區(qū)別码撰。
4、強(qiáng)抗碰撞:已知原數(shù)據(jù)和其MD5值个盆,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的脖岛。
MD5的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個(gè)任意長(zhǎng)度的字節(jié)串變換成一定長(zhǎng)的十六進(jìn)制數(shù)字串)。除了MD5以外颊亮,其中比較有名的還有sha-1柴梆、RIPEMD以及Haval等。
安全哈希算法(Secure Hash Algorithm)主要適用于數(shù)字簽名標(biāo)準(zhǔn)(Digital Signature Standard DSS)里面定義的數(shù)字簽名算法(Digital Signature Algorithm DSA)终惑。對(duì)于長(zhǎng)度小于2^64位的消息绍在,SHA1會(huì)產(chǎn)生一個(gè)160位的消息摘要。該算法經(jīng)過(guò)加密專(zhuān)家多年來(lái)的發(fā)展和改進(jìn)已日益完善,并被廣泛使用偿渡。該算法的思想是接收一段明文臼寄,然后以一種不可逆的方式將它轉(zhuǎn)換成一段(通常更小)密文溜宽,也可以簡(jiǎn)單的理解為取一串輸入碼(稱(chēng)為預(yù)映射或信息)脯厨,并把它們轉(zhuǎn)化為長(zhǎng)度較短、位數(shù)固定的輸出序列即散列值(也稱(chēng)為信息摘要或信息認(rèn)證代碼)的過(guò)程坑质。散列函數(shù)值可以說(shuō)是對(duì)明文的一種“指紋”或是“摘要”所以對(duì)散列值的數(shù)字簽名就可以視為對(duì)此明文的數(shù)字簽名合武。
SHA-1是1994年修訂的版本,糾正了SH一個(gè)未公布的缺陷涡扼。這種算法接受的輸入文檔小于2的64次方 位稼跳,產(chǎn)生160位的報(bào)文摘要。該算法實(shí)際的目標(biāo)使得找出一個(gè)能夠匹配給定的散列值的文本是不可能的計(jì)算吃沪,也就是說(shuō)汤善,如果對(duì)文檔A已經(jīng)計(jì)算出了散列值H(A),那么很難找到一個(gè)文檔B票彪,使其散列值H(B)=H(A)红淡,尤其困難的是無(wú)法找到滿(mǎn)足上述條件的,而且有特定內(nèi)容的文檔B降铸。SHA算法的缺點(diǎn)是速度比MD5慢在旱,但是SHA的報(bào)文摘要更長(zhǎng),更有利于對(duì)抗野蠻的攻擊推掸!
/*
*字符串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@"";
}
}
因項(xiàng)目中涉及到校驗(yàn)算法桶蝎,在這md5和sha1的字符串校驗(yàn)和文件校驗(yàn)都已實(shí)現(xiàn)。
在此感謝萬(wàn)能的互聯(lián)網(wǎng)谅畅,本文僅作學(xué)習(xí)交流使用,禁止任何形式的轉(zhuǎn)載和商業(yè)用途登渣。
請(qǐng)勿用于商業(yè)及非法用途,如由此引起的相關(guān)法律法規(guī)責(zé)任毡泻,與我們無(wú)關(guān)胜茧!