iOS-資料摘要的生成
阿新 • • 發佈:2018-11-01
背景
首先我們要知道什麼是資料摘要,資料摘要是幹什麼用的。
資料摘要是不可逆的,其功能有資料簽名、資料完整性校驗等。
常見的資料摘要演算法有MD5、SHA1、SHA256、SHA384,下面使用SHA256完成實驗。
實驗要求
- 程式語言不限制
- 自選一段不少於500字的關於資料摘要演算法的文字
- 摘要演算法不能是MD5
- 輸出摘要
- 改動原始檔案中的一個字元,再次輸出摘要
- 對比兩個摘要變化了多少(統計不同的位數)
程式碼
#import "ViewController.h" #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCrypto.h> #import <CommonCrypto/CommonHMAC.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 線上工具校驗 http://www.atool.org/hash.php NSString *textPlain = @"近年來,隨著網際網路技術蓬勃發展、資訊化的高度發達和移動通訊技術的廣泛應用,每個人都能在網際網路+的時代下迎來了新的機遇和新的挑戰。如今是一個多元化的時代,互聯互通超越時空差距,使組織與使用者、人與人之間的距離零成本趨近,無障礙溝通與交流價值倍增。這意味著每個街邊小攤都可以結合網際網路來進行商業銷售,也意味著街邊小攤主要隨時應對市場和客戶的需求變化。而傳統的擺攤模式無法快速高效地讓本攤的宣傳做出調整,這對每個攤主來說都是一個低效率的銷售模式。一方面,如果攤主每次擺攤在臨時地點,那麼攤主服務的顧客就幾乎是一次性的,顧客下一次也幾乎找不到這個小攤。另一方面,攤主如果每次增加新的菜品和食品,顧客也無法及時知道該小攤推出新品。移動小攤軟體使用地圖對小攤資訊進行展示,能夠極大程度地實時更新小攤位置和小攤列表資訊,提高攤主擺攤的擺攤效率。1.2 國內外研究現狀大約上世紀90年代開始,歐美等發達國家對食品的監控越來越嚴格,並且政府對亂擺攤的行為肅清。由此,歐美等發達國家的攤主開始使用移動車進行擺攤。攤主在貫徹國家政策的同時,並且結合自己的擺攤經驗在實踐上取得了成果,達到了較高的擺攤水平。我國計算機發展時間較短,個人資訊化和自動化的水平較低,受到國內資源和政策的影響,目前國內大部分攤主都是採用傳統的擺攤模式,僅少部分攤主效仿歐美等發達國家的攤主使用移動車進行擺攤。對於顧客而言,顧客無法得知附近有多少小攤以及小攤的擺攤食品資訊。對於攤主而言,由於受到服務範圍的限制,攤主也無法對自己小攤進行大力度宣傳。我們應該把先進的計算機技術和科學資訊管理結合,勇於創新,把研究成果運用到實際的商業中,提高攤主的擺攤效率,降低擺攤的時間成本。"; NSString *dataSummary = [self SHA256Hash:textPlain]; NSUInteger length = dataSummary.length; NSLog(@"未修改前資料摘要:%@",dataSummary); NSLog(@"未修改前摘要長度:%lu",(unsigned long)length); NSString *textPlain1 = @"十年後,隨著網際網路技術蓬勃發展、資訊化的高度發達和移動通訊技術的廣泛應用,每個人都能在網際網路+的時代下迎來了新的機遇和新的挑戰。如今是一個多元化的時代,互聯互通超越時空差距,使組織與使用者、人與人之間的距離零成本趨近,無障礙溝通與交流價值倍增。這意味著每個街邊小攤都可以結合網際網路來進行商業銷售,也意味著街邊小攤主要隨時應對市場和客戶的需求變化。而傳統的擺攤模式無法快速高效地讓本攤的宣傳做出調整,這對每個攤主來說都是一個低效率的銷售模式。一方面,如果攤主每次擺攤在臨時地點,那麼攤主服務的顧客就幾乎是一次性的,顧客下一次也幾乎找不到這個小攤。另一方面,攤主如果每次增加新的菜品和食品,顧客也無法及時知道該小攤推出新品。移動小攤軟體使用地圖對小攤資訊進行展示,能夠極大程度地實時更新小攤位置和小攤列表資訊,提高攤主擺攤的擺攤效率。1.2 國內外研究現狀大約上世紀90年代開始,歐美等發達國家對食品的監控越來越嚴格,並且政府對亂擺攤的行為肅清。由此,歐美等發達國家的攤主開始使用移動車進行擺攤。攤主在貫徹國家政策的同時,並且結合自己的擺攤經驗在實踐上取得了成果,達到了較高的擺攤水平。我國計算機發展時間較短,個人資訊化和自動化的水平較低,受到國內資源和政策的影響,目前國內大部分攤主都是採用傳統的擺攤模式,僅少部分攤主效仿歐美等發達國家的攤主使用移動車進行擺攤。對於顧客而言,顧客無法得知附近有多少小攤以及小攤的擺攤食品資訊。對於攤主而言,由於受到服務範圍的限制,攤主也無法對自己小攤進行大力度宣傳。我們應該把先進的計算機技術和科學資訊管理結合,勇於創新,把研究成果運用到實際的商業中,提高攤主的擺攤效率,降低擺攤的時間成本。"; NSString *dataSummary1 = [self SHA256Hash:textPlain1]; NSUInteger length1 = dataSummary1.length; NSLog(@"修改後資料摘要:%@",dataSummary1); NSLog(@"修改後前摘要長度:%lu",(unsigned long)length1); //flag計數兩個字串不同的地方個數 int flag = 0; for (int i = 0; i < length - 1; i ++) { char a = [dataSummary characterAtIndex:i]; char b = [dataSummary1 characterAtIndex:i]; if (a==b) { // NSLog(@"一樣"); } else { flag++; // NSLog(@"不一樣"); } } NSLog(@"修改後,摘要變化為個數:%d",flag); } /** SHA256提取數摘要(中文或英文都可以) @param plainText 原文 @return 生成的資料摘要 */ - (NSString *)SHA256Hash:(NSString *)plainText { const char *str = plainText.UTF8String; unsigned char *digest; digest = malloc(CC_SHA256_DIGEST_LENGTH); CC_SHA256(str, (CC_LONG)strlen(str), digest); NSString *encode = [self stringFromBytes:digest length:CC_SHA256_DIGEST_LENGTH]; free(digest); return encode; } /** 位元組轉化為字串 字元大小寫可以通過修改“%02X”中的x修改,下面採用的是大寫 */ - (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length { NSMutableString *strM = [NSMutableString string]; for (int i = 0; i < length; i++) { [strM appendFormat:@"%02X", bytes[i]]; } return [strM copy]; } @end
總結
本次實驗,我對資料摘要演算法有了進一步的瞭解。提取資料摘要的方法有很多,有MD5,有SHA-1,SHA128,SHA224,SHA256,在這次實驗,我使用的是SHA256的演算法來提取摘要。並且,提取資料摘要的來源可以是文字文字、檔案、影象等等,而且對只要原文資訊稍微改變,生成的資料摘要就完全不一樣。比如,我在實驗中,我只是在原文資訊開頭修改了三個字,生成的資料摘要就完全不一樣了。並且,生成的資料摘要是不可逆的。最後,我使用for迴圈,對兩個生成的資料摘要逐個比較,計算出原文修改後,生成的資料摘要有多少個是不一樣的。
實驗中遇到的問題:
(1)使用蘋果的原生程式碼,原文不支援中文,只支援英文和數字,否則程式會崩潰。
(2)我怎麼知道我生成的資料摘要就是對的呢?
解決辦法:
(1)先讓字串轉化為UTF8格式的字元常量指標,然後再重新申請記憶體空間,使用蘋果自帶的SHA256提取資料摘要方法,然後轉碼重新生成資料摘要字串。
(2)百度搜索資料摘要線上指令碼,在線上網站上面輸入原文資訊,把得出的資料摘要資訊和我生成的資料摘要資訊進行對比。