2013年11月17日 星期日

iOS-SHA256

今天工作上用到了SHA256這個東東,到底用途是啥,接下來就來記錄整理估狗到的資料

SHA256的用途其實和數位簽章有關,上網查了一下數位簽章有兩個很重要的安全問題

  1. 訊息是不是本人發出的
  2. 訊息的內容是不是有被串改過

第一個問題的解法就是用憑證的方式來解決,假設有兩個人A和B,如果A要把訊息傳給B,B要怎麼知道訊息是從A本人傳來的呢?步驟如下:

  1. A把public key給CA(ex:內政部自然人憑證管理中心),然後CA會用A的private key加密產生憑證傳會給A
  2. 然後A把憑證還有用資訊送給B(訊息不一定要加密)

此時B只要向CA詢問A的public key然後以此解開憑證得到送來的public key,來比對是不是一樣,如果是的話就代表為A傳來的資訊。上面的方法解決了驗證是不是A本人自己傳來的資訊,但是有個問題,到底送來的資訊有沒有被篡改,例如用網路ATM匯款1000塊,總不想被人多加幾個0吧!這時該怎麼辦呢?解決方法就是對傳送來的資料下手,做法是會把想要的資料去做hash來的到一組字串,然後再用A自己本身的private key做加密,此步驟就是平常稱的數位簽章

此時B只要用A的public key將數位簽章解密的到的資訊和A送來的資訊做比對看是不是一樣,如果是的話就會相信訊息沒有被篡改過。

值得注意的是,以前總是認為數位簽章和訊息的加密解密是一樣的,但是這兩者的概念不太一樣,一個是訊息不可被別人看到,一個只是在證明說訊息是某人發出的,雖然都用到密碼學上的演算法,但是目的是不同的,這點需要特別注意。

大概記錄完數位簽章的相關概念之後,那到底SHA256到底用在哪,顆顆,那就是用來驗證訊息是不是被篡改過的地方,以hash的方式來檢查訊息有沒有被串改過啦!之前都用網路上的第三方library,今天才知道有內建的library,用法如下:

#import <CommonCrypto/CommonDigest.h>


+ (NSString *)getSha256Encode:(NSString *)str{
    
    const char *buf = [str cStringUsingEncoding:NSUTF8StringEncoding];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(buf, (CC_LONG)strlen(buf), result);
    NSMutableString *resultString = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [resultString appendFormat:@"%02x",result[i]];
    }
    
    return resultString;
}

沒有留言:

張貼留言