Message Digest Algorithm MD5(中文名為消息摘要算法第五版)為計算機安全領域廣泛使用的一種散列函數(shù),用以提供消息的完整性保護。該算法的文件號為RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現(xiàn)。將數(shù)據(jù)(如漢字)運算為另一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特點:
1、壓縮性:任意長度的數(shù)據(jù),算出的MD5值長度都是固定的。
2、容易計算:從原數(shù)據(jù)計算出MD5值很容易。
3、抗修改性:對原數(shù)據(jù)進行任何改動,哪怕只修改1個字節(jié),所得到的MD5值都有很大區(qū)別。
4、強抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
MD5的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節(jié)串變換成一定長的十六進制數(shù)字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。
安全哈希算法(Secure Hash Algorithm)主要適用于數(shù)字簽名標準(Digital Signature Standard DSS)里面定義的數(shù)字簽名算法(Digital Signature Algorithm DSA)。對于長度小于2^64位的消息,SHA1會產(chǎn)生一個160位的消息摘要。該算法經(jīng)過加密專家多年來的發(fā)展和改進已日益完善,并被廣泛使用。該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉換成一段(通常更?。┟芪?,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),并把它們轉化為長度較短、位數(shù)固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。散列函數(shù)值可以說是對明文的一種“指紋”或是“摘要”所以對散列值的數(shù)字簽名就可以視為對此明文的數(shù)字簽名。
SHA-1是1994年修訂的版本,糾正了SH一個未公布的缺陷。這種算法接受的輸入文檔小于2的64次方 位,產(chǎn)生160位的報文摘要。該算法實際的目標使得找出一個能夠匹配給定的散列值的文本是不可能的計算,也就是說,如果對文檔A已經(jīng)計算出了散列值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的字符串校驗和文件校驗都已實現(xiàn)。
在此感謝萬能的互聯(lián)網(wǎng),本文僅作學習交流使用,禁止任何形式的轉載和商業(yè)用途。
請勿用于商業(yè)及非法用途,如由此引起的相關法律法規(guī)責任,與我們無關!