06、數據安全

一、常用術語
  • 密鑰:密鑰是一種參數,它是在明文轉換為密文或將密文轉換為明文的算法中輸入的參數。密鑰分為對稱密鑰與非對稱秘鑰。
  • 明文:沒有進行加密,能夠直接代表原文含義的信息
  • 密文:經過加密處理之后,隱藏原文含義的信息
  • 加密:將明文轉換成密文的實施過程
  • 解密:將密文轉換成明文的實施過程
二、MD5

MD5:名為消息摘要算法第五版,為計算機安全領域廣泛使用的一種散列函數,用以提供消息的完整性保護。
MD5算法的特點:

  • 壓縮性:任意長度的數據,算出的MD5值長度都是固定的128位 二進制,32位 十六進制。
  • 容易計算:從原數據計算出MD5值很容易。
  • 抗修改性:對源數據進行任何改動,哪怕只改一個字節,所得到的MD5值都有很大差別。
  • 強抗碰撞:已知源數據及其MD5值,想找到一個具有相同MD5值的數據是非常困難的。
    使用MD5加密時,首先要引入<CommonCrypto/CommonCrypto.h>頭文件,在進行如下操作,例如對NSString類型進行加密
#import <CommonCrypto/CommonCrypto.h>//加密相關的頭文件
//MD5對字符串進行加密  128位的二進制,   32位 十六進制
-(void)md5MethodWithSourceingString:(NSString*)sourceString{
   
   //用的是c語言的函數進行的加密,所以我們需要將字符串轉換為c語言字符串
   const char* str = sourceString.UTF8String;
   //聲明一個c語言的字符數組用來存放加密之后的所有字符
   unsigned char result[CC_MD5_DIGEST_LENGTH];
   //MD5加密
   //第一個參數:要加密的源字符串
   //第二個參數:要加密的字符串的長度
   //第三個參數:用來接收加密好的字符的容器
   CC_MD5(str, (CC_LONG)strlen(str), result);
  //將加密好的字符數組中的字符轉為16進制的字符串以供使用
   NSMutableString* resultStr=[[NSMutableString alloc] init];
   for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {
       //將c語言字符轉換為16進制的字符串
       [resultStr appendFormat:@"%02x",result[i]];
   }
   NSLog(@"md5----%@",resultStr);
}

使用MD5對NSData類型的數據進行加密,例如加密圖片

//用MD5對NSData類型進行加密
-(void)md5WithsourceData:(NSData*)sourceData{
    //創建MD5變量
    CC_MD5_CTX md5;
    //初始化MD5變量
    CC_MD5_Init(&md5);
    //準備MD5加密
    //第一個參數就是MD5變量取地址
    //第二個參數就是要進行加密的數據 bytes是將NSData轉換為c語言的二進制類型
    //第三個參數就是數據長度
    CC_MD5_Update(&md5, sourceData.bytes, (CC_LONG)sourceData.length);
    //結束MD5加密
    // 接收加密好的數據容器
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5_Final(result, &md5);
    NSMutableString* resultStr=[[NSMutableString alloc] init];
    for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {
        [resultStr appendFormat:@"%02X",result[i]];
    }
    NSLog(@"MD5png-------%@",resultStr);
 
}
三、SHA-1

SHA1安全散列算法(英語:Secure Hash Algorithm)是一種能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。由美國國家安全局(NSA)所設計,并由美國國家標準與技術研究院(NIST)發布;是美國的政府標準。曾被視為是MD5(更早之前被廣為使用的散列函數)的后繼者。
例如SHA-1對字符串進行加密

//SHA-1加密  160位 二進制     40位 十六進制
-(void)shaMethodWithSourceingString:(NSString*)sourceString{
    //用的是c語言的函數進行的加密,所以我們需要將字符串轉換為c語言字符串
    const char* str = sourceString.UTF8String;
    //聲明一個c語言的字符數組用來存放加密之后的所有字符
    unsigned char result[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(str, (CC_LONG)strlen(str), result);
     NSMutableString* resultStr=[[NSMutableString alloc] init];
    for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
        [resultStr appendFormat:@"%02x",result[i]];
    }
      NSLog(@"sha-1-------%@",resultStr);
    
}

SHA-1對NSData類型的數據進行加密,這里加密圖片

//用SHA-1對NSData類型進行加密
-(void)shaWithsourceData:(NSData*)sourceData{
    //創建MD5變量
    CC_SHA1_CTX sha;
    //初始化MD5變量
    CC_SHA1_Init(&sha);
    //準備MD5加密
    CC_SHA1_Update(&sha, sourceData.bytes, (CC_LONG)sourceData.length);
    //結束MD5加密
    unsigned char result[CC_SHA1_DIGEST_LENGTH];
    //結束加密
    CC_SHA1_Final(result, &sha);
    NSMutableString* resultStr=[[NSMutableString alloc] init];
    for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
        [resultStr appendFormat:@"%02X",result[i]];
    }
    NSLog(@"SHApng-------%@",resultStr);
  
}
四、鑰匙串加密

鑰匙串(英文:Keychain)是蘋果公司Mac OS中的密碼管理系統。它在Mac OS 8.6中被導入,并且包括在了所有后續的Mac OS版本中,包括Mac OS X。一個鑰匙串可以包含多種類型的數據:密碼(包括網站,FTP服務器,SSH帳戶,網絡共享,無線網絡,群組軟件,加密磁盤鏡像等),私鑰,電子證書和加密筆記等。KeyChain是一種對稱加密
(1)首先拖入KeychainItemWrapper的.m和.h文件
(2)在工程的Build Phases設置的Compile Sources下給KeychainItemWrapper.m后面加上-fno-objc-arc,讓這個非arc的類可以在arc工程下編譯
(3)在Link Binary With Libraries下面加上Security.framework

Snip20161221_1.png

接下來進行加密就可以了

//鑰匙串加密
//一般用在保存我們不希望發生變化的數據,例如應用程序的UUID,在iOS7之后,我們將應用程序卸載重裝,應用程序的UUID可能會發生變化,我們不希望它一直變化,就可以將UUID存儲在鑰匙串中
-(void)keychain{
    //初始化工具類
    //第一個參數:當前工具的標識符,為了取值的時候,可以根據標識符找到對應的工具
    //第二個參數:一般填工程的唯一標識符,一般是用來區分是哪個工程所保存的數據
    KeychainItemWrapper* key=[[KeychainItemWrapper alloc] initWithIdentifier:@"yf" accessGroup:@"com.xalo.Test-01.Senior-secret-YF"];
    //存儲用戶名和密碼
    //使用和字典基本一致,但是key必須使用系統提供的,不能自己定義
   [key setObject:@"用戶名" forKey:(__bridge id)kSecAttrAccount];
   [key setObject:@"密碼" forKey:(__bridge id)kSecValueData];
    
    //清除鑰匙串中存儲的數據
   // [key resetKeychainItem];
    NSString* userName= [key objectForKey:(__bridge id)kSecAttrAccount];
    NSLog(@"%@",userName);
    NSString* passWord= [key objectForKey:(__bridge id)kSecValueData];
    NSLog(@"%@",passWord);
   
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.數據安全 01數據安全的原則1)在網絡上"不允許"傳輸用戶隱私數據的"明文"2.)在本地"不允許"保存用戶隱私...
    陳賀閱讀 2,175評論 0 2
  • 0x01 目錄 常見編碼: ASCII編碼 Base64/32/16編碼 shellcode編碼 Quoted-p...
    H0f_9閱讀 12,930評論 2 17
  • 本文主要介紹移動端的加解密算法的分類、其優缺點特性及應用,幫助讀者由淺入深地了解和選擇加解密算法。文中會包含算法的...
    蘋果粉閱讀 11,553評論 5 29
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,082評論 6 13
  • 結束了上午永平姐的目標管理之后,廢寢忘食、手腳并用的一周終于結束了。驟然降溫的城市,人們抄著手,勾著肩,吐著白氣,...
    亞男老師閱讀 918評論 0 6