iOS sha1加密方法(哈希算法,用于校驗數(shù)據(jù)完整性)以及字符串中含有漢字的情況的加密方法

最近在項目中使用到了網(wǎng)絡(luò)請求簽名認證的方法,于是在網(wǎng)上找關(guān)于OC sha1加密的方法,很快找到了一個大眾使用的封裝好的方法,以下代碼便是

首先需要添加頭文件
#import<CommonCrypto/CommonDigest.h>
然后直接使用下面的方法就可以了
//sha1加密方式
- (NSString *) sha1:(NSString *)input
{
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(data.bytes, (unsigned int)data.length, digest);
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
        [output appendFormat:@"%02x", digest[i]];
    }
    return output;
}

我直接在項目中使用了這個方法,而且完美解決問題,但是,今天重點說的是這個但是,在后期的項目修改中,需要加密的字符串里面增加了漢字(之前需要加密的字符串中無漢字),在這種情況下,上面的方法就和服務(wù)器那邊的加密不一樣了(艱難的調(diào)試排除問題的過程不贅述);

最終發(fā)現(xiàn)的原因就是我這邊生成的加密字符串服務(wù)器那邊生成的不一樣,自然就會發(fā)生錯誤;錯誤的原因就是因為加密的字符串中包含有漢字
然后是在網(wǎng)上查找,在<[主題:如何對中文字符串進行sha1加密][id]>這個帖子中找到了方法,現(xiàn)貢獻給大家
[id]:http://www.cocoachina.com/bbs/read.php?tid=263440&page=e&#a

首先需要添加頭文件
#import<CommonCrypto/CommonDigest.h>
然后直接使用下面的方法就可以了
//sha1加密方式
- (NSString *) sha1:(NSString *)input
{
    //const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    //NSData *data = [NSData dataWithBytes:cstr length:input.length];
    
     NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    
    CC_SHA1(data.bytes, (unsigned int)data.length, digest);
    
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
        [output appendFormat:@"%02x", digest[i]];
    }
    
    return output;
}

可以看出這個方法與第一個方法的區(qū)別,頭兩句注釋掉了,用

 NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];

代替了那兩句的作用;

帖子一樓bindbasic的原話是這樣的

用上面的方法中文字符串轉(zhuǎn)data時會造成數(shù)據(jù)丟失,
把
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];  
    NSData *data = [NSData dataWithBytes:cstr length:input.length]; 

這兩句改成

NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
就可以了

經(jīng)實測,第二種方法的加密方式適用于純字符串以及帶有中文的字符串,推薦使用,推薦使用,推薦使用?。。。ㄖ匾氖虑檎f三遍)

備注:嚴(yán)格來說,sha1(安全[哈希算法])只是叫做一種算法,用于檢驗數(shù)據(jù)完整性,并不能叫做加密~感謝2樓的指點

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • 當(dāng)下的所有米蘭球迷,都是局促的。交易遲遲沒有官方,心就只能一直懸著。我倒覺得,我們該拋下種種不安,對或許要...
    Krystal11閱讀 215評論 0 1
  • 1:什么是block?block其實就是一個代碼塊,把你想要執(zhí)行的代碼封裝在這個代碼塊里,等到需要的時候再去調(diào)用。...
    SDBridge閱讀 440評論 0 0

友情鏈接更多精彩內(nèi)容