加密算法隨筆(ios)
一、加密原則:
1、不能在網絡傳輸過程中明文傳輸
2、本地保存用戶信息不能明文保存
二、加密算法
? 1、RSA? 非對稱加密:私鑰加密,公鑰解密
? ? 秘鑰是個Key:就是一個數字,需要通過因式分解來破解
? ? 現在的計算機破解需要50年
? 2、哈希函數? 散列函數
? ? - MD5
? ? - SHA1
? ? - SHA256/512
? 3、對稱加密
? ? - DES
? ? - 3DES
? ? - AES(高級密碼標準,美國國家安全局使用的,iOS內部使用的也是這個),理論破解時間1萬年(哈哈哈)
4、MD5:
特點:
? ? - 算法公開
? ? - 對相同的數據加密,得到的結果是一樣的
? ? - 對不同的數據加密,得到的結果是定長的(32位字符:a-z 0-9)
? ? - 信息摘要,信息指紋
? ? - 不可逆算
? 破解:
? ? - 散列碰撞(按照一定規律去比較。規律需要研究)
? 例子(c語言的):
? ? uint8_t bugger(CC_MD5_DIGEST_LENGTH) // 開辟空間
? ? CC_MD5(str, (CC_LONG)strlen(str), btffer) // 加密
? ? md5Str = [str stringFromBytes:bugger length:CC_MD5_DIGEST_LENGTH] // 獲取
三、網絡傳輸過程中加密:
目前只靠MD5不夠安全,解決方案
1、再拼接一段字符串key
? ? static? NSString *salt = @"fdjsfeiurdshfjnxvjncxjvnxcjkvnjdkfngdngjndfgndfkjgndfkjgndf" // (足夠長)
? ? pwd = password + salt // 拼接
? ? pwd = pwd.md5 // 加密
? ? 缺點:是寫死在程序里的,容易泄露,根據版本迭代,還不能改
2、HMAC加密算法(基于MD5的)目前一兩年在國內開始增多
? 給定一個秘鑰key(一般從服務器獲取的隨機數(獲取一次),開發人員是無法知道的)
? (明文+key)進行HMAC加密
? 登錄思路:
? 1、用戶輸入賬號密碼
? 2、本地查找是否存在key,如果沒有key,向服務器獲取(發給服務器一個賬號,賬號和key是綁定的),這時候服務器會判斷是否需要進行一些判斷(設備鎖什么的)
? 3、獲取key之后再加密
? 4、登陸
? 以上缺點都是 被抓包后,就沒辦法了
3、加上時間:HMAC加密后的密碼再拼接一個字符串(201712141620)時間,然后再md5
? 時間精確到分,服務器判斷有效期只有1分鐘,防抓包
四、本地加密(例如保存密碼):
鑰匙串保存密碼
? - 蘋果ios7.0.3開放給開發者的
? - 鑰匙串使用的加密算法是AES算法
? - 蘋果原生是C語言,不過有三方庫