iOS NSString 加密

NSString+Hash.h

#import <Foundation/Foundation.h>

@interface NSString (Hash)

#pragma mark - 散列函數
/**
 *  計算MD5散列結果
 *
 *  終端測試命令:
 *  @code
 *  md5 -s "string"
 *  @endcode
 *
 *  <p>提示:隨著 MD5 碰撞生成器的出現,MD5 算法不應被用于任何軟件完整性檢查或代碼簽名的用途培愁。<p>
 *
 *  @return 32個字符的MD5散列字符串
 */
- (NSString *)md5String;

/**
 *  計算SHA1散列結果
 *
 *  終端測試命令:
 *  @code
 *  echo -n "string" | openssl sha -sha1
 *  @endcode
 *
 *  @return 40個字符的SHA1散列字符串
 */
- (NSString *)sha1String;

/**
 *  計算SHA256散列結果
 *
 *  終端測試命令:
 *  @code
 *  echo -n "string" | openssl sha -sha256
 *  @endcode
 *
 *  @return 64個字符的SHA256散列字符串
 */
- (NSString *)sha256String;

/**
 *  計算SHA 512散列結果
 *
 *  終端測試命令:
 *  @code
 *  echo -n "string" | openssl sha -sha512
 *  @endcode
 *
 *  @return 128個字符的SHA 512散列字符串
 */
- (NSString *)sha512String;

#pragma mark - HMAC 散列函數
/**
 *  計算HMAC MD5散列結果
 *
 *  終端測試命令:
 *  @code
 *  echo -n "string" | openssl dgst -md5 -hmac "key"
 *  @endcode
 *
 *  @return 32個字符的HMAC MD5散列字符串
 */
- (NSString *)hmacMD5StringWithKey:(NSString *)key;

/**
 *  計算HMAC SHA1散列結果
 *
 *  終端測試命令:
 *  @code
 *  echo -n "string" | openssl sha -sha1 -hmac "key"
 *  @endcode
 *
 *  @return 40個字符的HMAC SHA1散列字符串
 */
- (NSString *)hmacSHA1StringWithKey:(NSString *)key;

/**
 *  計算HMAC SHA256散列結果
 *
 *  終端測試命令:
 *  @code
 *  echo -n "string" | openssl sha -sha256 -hmac "key"
 *  @endcode
 *
 *  @return 64個字符的HMAC SHA256散列字符串
 */
- (NSString *)hmacSHA256StringWithKey:(NSString *)key;

/**
 *  計算HMAC SHA512散列結果
 *
 *  終端測試命令:
 *  @code
 *  echo -n "string" | openssl sha -sha512 -hmac "key"
 *  @endcode
 *
 *  @return 128個字符的HMAC SHA512散列字符串
 */
- (NSString *)hmacSHA512StringWithKey:(NSString *)key;

#pragma mark - 文件散列函數

/**
 *  計算文件的MD5散列結果
 *
 *  終端測試命令:
 *  @code
 *  md5 file.dat
 *  @endcode
 *
 *  @return 32個字符的MD5散列字符串
 */
- (NSString *)fileMD5Hash;

/**
 *  計算文件的SHA1散列結果
 *
 *  終端測試命令:
 *  @code
 *  openssl sha -sha1 file.dat
 *  @endcode
 *
 *  @return 40個字符的SHA1散列字符串
 */
- (NSString *)fileSHA1Hash;

/**
 *  計算文件的SHA256散列結果
 *
 *  終端測試命令:
 *  @code
 *  openssl sha -sha256 file.dat
 *  @endcode
 *
 *  @return 64個字符的SHA256散列字符串
 */
- (NSString *)fileSHA256Hash;

/**
 *  計算文件的SHA512散列結果
 *
 *  終端測試命令:
 *  @code
 *  openssl sha -sha512 file.dat
 *  @endcode
 *
 *  @return 128個字符的SHA512散列字符串
 */
- (NSString *)fileSHA512Hash;

@end

NSString+Hash.m


#import "NSString+Hash.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation NSString (Hash)

#pragma mark - 散列函數
- (NSString *)md5String {
    const char *str = self.UTF8String;
    uint8_t buffer[CC_MD5_DIGEST_LENGTH];
    
    CC_MD5(str, (CC_LONG)strlen(str), buffer);
    
    return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}

- (NSString *)sha1String {
    const char *str = self.UTF8String;
    uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
    
    CC_SHA1(str, (CC_LONG)strlen(str), buffer);
    
    return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
}

- (NSString *)sha256String {
    const char *str = self.UTF8String;
    uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
    
    CC_SHA256(str, (CC_LONG)strlen(str), buffer);
    
    return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH];
}

- (NSString *)sha512String {
    const char *str = self.UTF8String;
    uint8_t buffer[CC_SHA512_DIGEST_LENGTH];
    
    CC_SHA512(str, (CC_LONG)strlen(str), buffer);
    
    return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH];
}

#pragma mark - HMAC 散列函數
- (NSString *)hmacMD5StringWithKey:(NSString *)key {
    const char *keyData = key.UTF8String;
    const char *strData = self.UTF8String;
    uint8_t buffer[CC_MD5_DIGEST_LENGTH];
    
    CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);
    
    return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}

- (NSString *)hmacSHA1StringWithKey:(NSString *)key {
    const char *keyData = key.UTF8String;
    const char *strData = self.UTF8String;
    uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
    
    CCHmac(kCCHmacAlgSHA1, keyData, strlen(keyData), strData, strlen(strData), buffer);
    
    return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
}

- (NSString *)hmacSHA256StringWithKey:(NSString *)key {
    const char *keyData = key.UTF8String;
    const char *strData = self.UTF8String;
    uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
    
    CCHmac(kCCHmacAlgSHA256, keyData, strlen(keyData), strData, strlen(strData), buffer);
    
    return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH];
}

- (NSString *)hmacSHA512StringWithKey:(NSString *)key {
    const char *keyData = key.UTF8String;
    const char *strData = self.UTF8String;
    uint8_t buffer[CC_SHA512_DIGEST_LENGTH];
    
    CCHmac(kCCHmacAlgSHA512, keyData, strlen(keyData), strData, strlen(strData), buffer);
    
    return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH];
}

#pragma mark - 文件散列函數

#define FileHashDefaultChunkSizeForReadingData 4096

- (NSString *)fileMD5Hash {
    NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
    if (fp == nil) {
        return nil;
    }
    
    CC_MD5_CTX hashCtx;
    CC_MD5_Init(&hashCtx);
    
    while (YES) {
        @autoreleasepool {
            NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
            
            CC_MD5_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
            
            if (data.length == 0) {
                break;
            }
        }
    }
    [fp closeFile];
    
    uint8_t buffer[CC_MD5_DIGEST_LENGTH];
    CC_MD5_Final(buffer, &hashCtx);
    
    return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}

- (NSString *)fileSHA1Hash {
    NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
    if (fp == nil) {
        return nil;
    }
    
    CC_SHA1_CTX hashCtx;
    CC_SHA1_Init(&hashCtx);
    
    while (YES) {
        @autoreleasepool {
            NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
            
            CC_SHA1_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
            
            if (data.length == 0) {
                break;
            }
        }
    }
    [fp closeFile];
    
    uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1_Final(buffer, &hashCtx);
    
    return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
}

- (NSString *)fileSHA256Hash {
    NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
    if (fp == nil) {
        return nil;
    }
    
    CC_SHA256_CTX hashCtx;
    CC_SHA256_Init(&hashCtx);
    
    while (YES) {
        @autoreleasepool {
            NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
            
            CC_SHA256_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
            
            if (data.length == 0) {
                break;
            }
        }
    }
    [fp closeFile];
    
    uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256_Final(buffer, &hashCtx);
    
    return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH];
}

- (NSString *)fileSHA512Hash {
    NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
    if (fp == nil) {
        return nil;
    }
    
    CC_SHA512_CTX hashCtx;
    CC_SHA512_Init(&hashCtx);
    
    while (YES) {
        @autoreleasepool {
            NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
            
            CC_SHA512_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
            
            if (data.length == 0) {
                break;
            }
        }
    }
    [fp closeFile];
    
    uint8_t buffer[CC_SHA512_DIGEST_LENGTH];
    CC_SHA512_Final(buffer, &hashCtx);
    
    return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH];
}

#pragma mark - 助手方法
/**
 *  返回二進制 Bytes 流的字符串表示形式
 *
 *  @param bytes  二進制 Bytes 數組
 *  @param length 數組長度
 *
 *  @return 字符串表示形式
 */
- (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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末森书,一起剝皮案震驚了整個濱河市荸恕,隨后出現的幾起案子叹誉,更是在濱河造成了極大的恐慌糖埋,老刑警劉巖夏跷,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哼转,死亡現場離奇詭異,居然都是意外死亡槽华,警方通過查閱死者的電腦和手機释簿,發(fā)現死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硼莽,“玉大人庶溶,你說我怎么就攤上這事煮纵。” “怎么了偏螺?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵行疏,是天一觀的道長。 經常有香客問我套像,道長酿联,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任夺巩,我火速辦了婚禮贞让,結果婚禮上,老公的妹妹穿的比我還像新娘柳譬。我一直安慰自己喳张,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布美澳。 她就那樣靜靜地躺著销部,像睡著了一般。 火紅的嫁衣襯著肌膚如雪制跟。 梳的紋絲不亂的頭發(fā)上舅桩,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音雨膨,去河邊找鬼擂涛。 笑死,一個胖子當著我的面吹牛聊记,可吹牛的內容都是我干的撒妈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼甥雕,長吁一口氣:“原來是場噩夢啊……” “哼踩身!你這毒婦竟也來了?” 一聲冷哼從身側響起社露,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤挟阻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后峭弟,有當地人在樹林里發(fā)現了一具尸體附鸽,經...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年瞒瘸,在試婚紗的時候發(fā)現自己被綠了坷备。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡情臭,死狀恐怖省撑,靈堂內的尸體忽然破棺而出赌蔑,到底是詐尸還是另有隱情,我是刑警寧澤竟秫,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布娃惯,位于F島的核電站,受9級特大地震影響肥败,放射性物質發(fā)生泄漏趾浅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一馒稍、第九天 我趴在偏房一處隱蔽的房頂上張望皿哨。 院中可真熱鬧,春花似錦纽谒、人聲如沸证膨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椎例。三九已至挨决,卻和暖如春请祖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脖祈。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工肆捕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盖高。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓慎陵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親喻奥。 傳聞我的和親對象是個殘疾皇子席纽,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容

  • /**ios常見的幾種加密方法: 普通的加密方法是講密碼進行加密后保存到用戶偏好設置( [NSUserDefaul...
    彬至睢陽閱讀 2,919評論 0 7
  • 看到網上有常用加密方法的總結,就轉存了一下撞蚕,應該對我們以后有幫助 常用的是MD5加密润梯,這是一種單向加密,實現如下:...
    丶墨墨丶閱讀 933評論 3 0
  • ------------------.h文件-------------------- #import<Founda...
    彬至睢陽閱讀 1,800評論 0 0
  • 拉斯維加斯附近究竟有沒有秘密基地甥厦? 是不是傳說之中的美國51區(qū)纺铭? NO!你已經out了! 今天就為大家揭曉一...
    紫露凝香868閱讀 590評論 0 3
  • 寫下這個標題后刀疙,我的腦中立馬浮現出多年來一直為我打理頭發(fā)的3號的形象舶赔。 ×號是理發(fā)店給店里的員工給的工號,就好像學...
    靜芳上海閱讀 240評論 0 1