App安全與加密下

Hash (散列函數(shù))

1.Hash定義

Hash:把任意長度的輸入,通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)。

2.哈希的特點

1.同樣的輸入會有同樣的哈希值。
2.同一個哈希值可以從不同的輸入得到。
3.任意長度的輸入得到的輸出長度固定,也就是說這種算法是不可以逆的。

3.哈希的用途

  1. 數(shù)字簽名
  2. 文件比對,同一個文件的hash值是一樣的,而且Hash值是很難重復的。
  3. git 提交的版本對比號碼
  4. 原文加密,比如用戶的密碼。在客戶端和服務器直接使用加密后的密碼,這樣黑客很難得到用戶的真實輸入的密碼。

4.常用的函數(shù)

// data 需要加密的數(shù)據(jù)  len 加密數(shù)據(jù)的長度 md 加密后的結(jié)果

//MD5 
CC_MD5(const void *data, CC_LONG len, unsigned char *md)

// SHA1 
CC_SHA1(const void *data, CC_LONG len, unsigned char *md)

// SHA256
CC_SHA256(const void *data, CC_LONG len, unsigned char *md)

5.高級版的哈希算法 - HMAC

HMAC是密鑰相關(guān)的哈希運算消息認證碼(HMAC運算利用哈希算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出。

// SHA512
CC_SHA512(const void *data, CC_LONG len, unsigned char *md)

// CCHmac 
/* algorithm 有:
    kCCHmacAlgSHA1,
    kCCHmacAlgMD5,
    kCCHmacAlgSHA256,
    kCCHmacAlgSHA384,
    kCCHmacAlgSHA512,
    kCCHmacAlgSHA224
*/
// key 加固數(shù)據(jù)
void CCHmac(
    CCHmacAlgorithm algorithm,  /* kCCHmacAlgSHA1, kCCHmacAlgMD5 */
    const void *key,
    size_t keyLength,           /* length of key in bytes */
    const void *data,
    size_t dataLength,          /* length of data in bytes */
}

6.終端生成Hash 值命令, 我們義字符串 “hello world” 為例

md5 -s "hello world" //MD5
echo -n "hello world"" | openssl sha -sha1 //SHA1
echo -n "hello world"" | openssl sha -sha256 //SHA256
echo -n "hello world"" | openssl sha -sha512 //SHA512
echo -n "hello world"" | openssl dgst -md5 -hmac "key" //HMAC + MD5
echo -n "hello world"" | openssl sha -sha1 -hmac "key" /HMAC + SHA1
echo -n "hello world"" | openssl sha -sha256 -hmac "key" /HMAC + SHA256
echo -n "hello world"" | openssl sha -sha512 -hmac "key" /HMAC + SHA512

Hash 破解與防范

破解原理

  1. 通過窮舉字符組合的方式,創(chuàng)建了明文密文對應查詢數(shù)據(jù)庫。 這種破解的一般是密碼,這種簡單的字符串
  2. 獲得簽名的規(guī)則和加鹽值,進行重簽名,然后就可以更改參數(shù)的值

防范

  1. 對于密碼的轉(zhuǎn)化,可以使用更難窮舉的HMAC
  2. 對于重簽名,加鹽的參數(shù)不放在客戶端【客戶端可逆向獲取】
  3. 對于網(wǎng)絡傳輸加鹽值可以截取的問題,可以將這個設置一個時效性。
  4. 參數(shù)不要采用明文,可以使用一定的加密方式

對稱加密

常見的對稱加密方式

DES 3DES AES "高級"加密標準
ECB 電子代碼本,每個塊都是獨立加密的
CBC 密碼塊鏈:使用一個密鑰和一個初始化向量 (IV)對數(shù)據(jù)執(zhí)行加密轉(zhuǎn)換,可以有效地保證密文的完整性。

重要的函數(shù)

 CCCryptorStatus CCCrypt(
    CCOperation op,         /* kCCEncrypt, etc. */
    CCAlgorithm alg,        /* kCCAlgorithmAES128, etc. */
    CCOptions options,      /* kCCOptionPKCS7Padding, etc. */
    const void *key,
    size_t keyLength,
    const void *iv,         /* optional initialization vector */
    const void *dataIn,     /* optional per op and alg */
    size_t dataInLength,
    void *dataOut,          /* data RETURNED here */
    size_t dataOutAvailable,
    size_t *dataOutMoved)
enum {
    kCCModeECB      = 1,
    kCCModeCBC      = 2,
    kCCModeCFB      = 3,
    kCCModeCTR      = 4,
    kCCModeF8       = 5, // Unimplemented for now (not included)
    kCCModeLRW      = 6, // Unimplemented for now (not included)
    kCCModeOFB      = 7,
    kCCModeXTS      = 8,
    kCCModeRC4      = 9,
    kCCModeCFB8     = 10,
};

參數(shù)說明
1.CCOperation: kCCEncrypt:加密, kCCDecrypt:解密

2.alg 加密解密方式

2.1 kCCAlgorithmAES128 = 0
2.2  kCCAlgorithmAES = 0
2.3  kCCAlgorithmDES,
2.4 kCCAlgorithm3DES,       
2.5 kCCAlgorithmCAST,       
2.6 kCCAlgorithmRC4,
2.7 kCCAlgorithmRC2,   
2.8 kCCAlgorithmBlowfish      

3.options 加密選項 kCCOptionPKCS7Padding | kCCOptionECBMode 如果用了iv 就有 kCCOptionECBMode
4.key 加密解密的密鑰
5.keyLength 加密的長度, 根據(jù)alg 類型取對應的長度
6.iv 初始化向量
7.dataIn 加密數(shù)據(jù)
8.dataInLength 加密數(shù)據(jù)的長度
9.dataOut 加密解密后的數(shù)據(jù)
10.dataOutAvailable dataOut的長度
11.dataOutMoved 數(shù)據(jù)最后的長度

非對稱加密

重要函數(shù)

 SecKeyDecrypt(
SecKeyRef           key,                /* Private key */
SecPadding          padding,    /* kSecPaddingNone,kSecPaddingPKCS1, kSecPaddingOAEP */
const uint8_t       *cipherText,
size_t              cipherTextLen,/* length of cipherText */
uint8_t             *plainText,
size_t              *plainTextLen)

SecKeyDecrypt 使用公鑰加密

SecKeyRef 公鑰
SecPadding
cipherText 加密的數(shù)據(jù)
cipherTextLen 加密數(shù)據(jù)的長度
plainText 結(jié)果數(shù)據(jù)
plainTextLen 數(shù)據(jù)結(jié)果的長度

SecKeyDecrypt 使用私鑰解密

SecKeyDecrypt(
SecKeyRef           key,                /* Private key */
SecPadding          padding,/* kSecPaddingNone,   kSecPaddingPKCS1,kSecPaddingOAEP */
const uint8_t       *cipherText,
size_t              cipherTextLen,/* length of cipherText */
uint8_t             *plainText, 
size_t              *plainTextLen)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 這篇文章主要講述在Mobile BI(移動商務智能)開發(fā)過程中,在網(wǎng)絡通信、數(shù)據(jù)存儲、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 3,039評論 0 6
  • 這里先簡單介紹單向散列函數(shù)、消息摘要和哈希碰撞的的概念 單向散列函數(shù): 將任意長度的信息轉(zhuǎn)換為較短的固定長度的值,...
    坤_7a1e閱讀 3,647評論 0 0
  • 在介紹加密算法之前, 先介紹一下 base64: 0. base64 Base64要求把每三個8Bit的字節(jié)轉(zhuǎn)換為...
    reboot_q閱讀 13,750評論 3 8
  • 今天讀了兩本書,一本是《瘋羊血頂兒》,20萬字,《和烏鴉做鄰居·烏鴉銀斑點》,18萬字,練習一頁字貼,錄了...
    你的社會高哥閱讀 232評論 0 0
  • 【六項精進打卡】 2018.6.12 姓名:陳崗 企業(yè)名稱:上海孚因流體動力設備股份有限公司 打卡第51天 【知~...
    我心依舊_79e2閱讀 89評論 0 0

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