encryption
密碼學基本概念
密碼學的三大作用:加密( Encryption)、認證(Authentication),鑒定(Identification).
- 加密:防止壞人獲取你的數(shù)據(jù)。
- 認證:防止壞人修改了你的數(shù)據(jù)而你卻并沒有發(fā)現(xiàn)。
- 鑒權(quán):防止壞人假冒你的身份。
【base64】:
base64只是一種編碼方式,并不是一種加密算法,不要使用base64來加密數(shù)據(jù)。(由于“歷史原因”,電子郵件不支持非ASCII碼字符,如果要傳送的電子郵件帶有非ASCII碼字符(諸如中文)或者圖片,用戶收到的電子郵件將會是一堆亂碼,因此發(fā)明了Base64編碼算法)
/** 編碼 */ func base64Encoding(plainString:String)->String {let plainData = plainString.data(using: String.Encoding.utf8)let base64String = plainData?.base64EncodedString()return base64String! } /** 解碼*/ func base64Decoding(encodedString:String)->String {guard let decodedData = Data(base64Encoded: encodedString) else { return "" }let decodedString = String.init(data: decodedData, encoding: String.Encoding.utf8)return decodedString! } 復制代碼hash :
**hash哈希表:**查找事件復雜度為O(1), MD5和SHA-1可以說是目前應用最廣泛的Hash算法
1、建議使用SHA-256、SHA-3算法: 2、不建議使用MD2、MD4、MD5、SHA-1、RIPEMD算法來加密用戶密碼等敏感信息: 如md5算法,網(wǎng)上有很多查詢的字典庫,給出md5值,可以查到加密前的數(shù)據(jù)
- (NSString *)sha256String {unsigned char result[CC_SHA256_DIGEST_LENGTH];CC_SHA256(self.bytes, (CC_LONG)self.length, result);NSMutableString *hash = [NSMutableStringstringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {[hash appendFormat:@"%02x", result[i]];}return hash; } 復制代碼消息認證算法 :
要確保加密的消息不是別人偽造的,需要提供一個消息認證碼(MAC,Message authentication code)。 消息認證碼是帶密鑰的hash函數(shù),基于密鑰和hash函數(shù)。密鑰雙方事先約定,不能讓第三方知道。(key)
消息發(fā)送者使用MAC算法計算出消息的MAC值,追加到消息后面一起發(fā)送給接收者。接收者收到消息后,用相同的MAC算法計算接收到消息MAC值,并與接收到的MAC值對比是否一樣。
【開發(fā)者建議】: 建議使用HMAC-SHA256算法,避免使用CBC-MAC
- (NSString *)hmacStringUsingAlg:(CCHmacAlgorithm)alg withKey:(NSString *)key {size_t size;switch (alg) {case kCCHmacAlgMD5: size = CC_MD5_DIGEST_LENGTH; break;case kCCHmacAlgSHA1: size = CC_SHA1_DIGEST_LENGTH; break;case kCCHmacAlgSHA224: size = CC_SHA224_DIGEST_LENGTH; break;case kCCHmacAlgSHA256: size = CC_SHA256_DIGEST_LENGTH; break;case kCCHmacAlgSHA384: size = CC_SHA384_DIGEST_LENGTH; break;case kCCHmacAlgSHA512: size = CC_SHA512_DIGEST_LENGTH; break;default: return nil;}unsigned char result[size];const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];CCHmac(alg, cKey, strlen(cKey), self.bytes, self.length, result);NSMutableString *hash = [NSMutableString stringWithCapacity:size * 2];for (int i = 0; i < size; i++) {[hash appendFormat:@"%02x", result[i]];}return hash; } 復制代碼對稱加密算法 :
AES
在對稱加密算法中,數(shù)據(jù)發(fā)信方將明文(原始數(shù)據(jù))和加密密鑰一起經(jīng)過特殊加密算法處理后,使其變成復雜的加密密文發(fā)送出去。收信方收到密文后,若想解讀原文,則需要使用加密用過的密鑰及相同算法的逆算法對密文進行解密,才能使其恢復成可讀明文。在對稱加密算法中,使用的 【密鑰只有一個】,發(fā)收信雙方都使用這個密鑰對數(shù)據(jù)進行加密和解密,這就要求解密方事先必須知道加密密鑰。 該算法的缺點是,如果一旦密鑰泄漏,那么加密的內(nèi)容將都不可信了。
【開發(fā)者建議】: 1、建議使用AES算法。 2、DES默認的是56位的加密密鑰,已經(jīng)不安全,不建議使用。 3、注意加密模式不要使用ECB模式。ECB模式不安全,說明問題的經(jīng)典的三張圖片,如下:
明文:
用ECB加密模式后: 用CBC加密模式后: 需要設(shè)置iv偏移量iOS 默認為CBC模式 api中147行:
/*!@enum CCOptions@abstract Options flags, passed to CCCryptorCreate().@constant kCCOptionPKCS7Padding Perform PKCS7 padding. @constant kCCOptionECBMode Electronic Code Book Mode. Default is CBC. */ enum {/* options for block ciphers */kCCOptionPKCS7Padding = 0x0001,kCCOptionECBMode = 0x0002/* stream ciphers currently have no options */ }; typedef uint32_t CCOptions; 復制代碼- (NSData *)aes256EncryptWithKey:(NSData *)key iv:(NSData *)iv {if (key.length != 16 && key.length != 24 && key.length != 32) {return nil;}if (iv.length != 16 && iv.length != 0) {return nil;}NSData *result = nil;size_t bufferSize = self.length + kCCBlockSizeAES128;void *buffer = malloc(bufferSize);if (!buffer) return nil;size_t encryptedSize = 0;CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, // encode/decodekCCAlgorithmAES128,kCCOptionPKCS7Padding,key.bytes,key.length,iv.bytes,self.bytes,self.length,buffer,bufferSize,&encryptedSize);if (cryptStatus == kCCSuccess) {result = [[NSData alloc]initWithBytes:buffer length:encryptedSize];free(buffer);return result;} else {free(buffer);return nil;} } 復制代碼非對稱加密:
rsa
非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數(shù)據(jù)進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數(shù)據(jù)進行加密,那么只有用對應的公開密鑰才能解密(這個過程可以做數(shù)字簽名)。 非對稱加密主要使用的是RSA算法。
小結(jié)
幾條原則:
- 1、不要自己設(shè)計加密算法和協(xié)議,使用業(yè)界標準的算法。
- 2、對稱加密算法不要使用ECB模式,不建議使用DES算法。
- 3、要選擇合適長度的密鑰。
- 4、要確保隨機數(shù)生成器的種子具有足夠的信息熵。
- 5、不要使用沒有消息認證的加密算法加密消息,無法防重放。
- 6、當多個字符串拼接后做hash,要非常當心。
- 7、當給算法加yan鹽取值時不要太短,不要重復。
- 8、使用初始化向量時IV時,IV為常量的CBC,CFB,GCM等和ECB一樣可以重放,即采用上一個消息的最后一塊密文作為下一個消息的IV,是不安全的。
- 9、密鑰應遵循的原則 : (1)密鑰不能為常量,應隨機,定期更換,如果加密數(shù)據(jù)時使用的密鑰為常量,則相同明文加密會得到相同的密文,很難防止字典攻擊。 (2)開發(fā)同學要防范密鑰硬編碼的毛病。
貼上鏈接
總結(jié)
以上是生活随笔為你收集整理的encryption的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可以两天一充的骁龙8 Gen2手机:出现
- 下一篇: 微软急了!明明硬件不支持 老爷机批量收到