十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
在開發(fā)中經(jīng)常會(huì)遇到數(shù)據(jù)的加密,常見的有base64、DES、AES、RSA等,由于AES的用法相對(duì)簡(jiǎn)單一些,在公司的項(xiàng)目中,我們使用的是AES加密。但是遇到一個(gè)大坑就是后臺(tái)使用了AES的128/CBC/NoPadding加密模式,很可悲的是iOS中只有PKCS7Padding和PKCS5Padding這兩種模式,沒有NoPadding模式。經(jīng)過各種百度、谷歌后,終于發(fā)現(xiàn)了一篇文章解決了這個(gè)問題。

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)平湖,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
下面是參考文章的鏈接 :
問題就處在No Padding. No Pading的情況下,一定要對(duì)加密數(shù)據(jù)不是kCCKeySizeAES128倍數(shù)部分進(jìn)行0x0000的填充,不然加密長(zhǎng)度不正確,一般情況下選擇使用kCCOptionPKCS7Padding(也就是0x0001)進(jìn)行填充,但是我們是No Padding所以要用 0x0000 填充。
前言
軟件開發(fā)過程中,對(duì)數(shù)據(jù)進(jìn)行加密是保證數(shù)據(jù)安全的重要手段,常見的加密有Base64加密和MD5加密。Base64加密是可逆的,MD5加密目前來說一般是不可逆的。
MD5生成的是固定的128bit,即128個(gè)0和1的二進(jìn)制位,而在實(shí)際應(yīng)用開發(fā)中,通常是以16進(jìn)制輸出的,所以正好就是32位的16進(jìn)制,說白了也就是32個(gè)16進(jìn)制的數(shù)字。
MD5主要特點(diǎn)是 不可逆,相同數(shù)據(jù)的MD5值肯定一樣,不同數(shù)據(jù)的MD5值不一樣(也不是絕對(duì)的,但基本是不能一樣的)。
MD5算法還具有以下性質(zhì):
1、壓縮性:任意長(zhǎng)度的數(shù)據(jù),算出的MD5值長(zhǎng)度都是固定的。
2、容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易。
3、抗修改性:對(duì)原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕只修改1個(gè)字節(jié),所得到的MD5值都有很大區(qū)別。
4、弱抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
5、強(qiáng)抗碰撞:想找到兩個(gè)不同的數(shù)據(jù),使它們具有相同的MD5值,是非常困難的。
6、MD5加密是不可解密的,但是網(wǎng)上有一些解析MD5的,那個(gè)相當(dāng)于一個(gè)大型的數(shù)據(jù)庫,通過匹配MD5去找到原密碼。所以,只要在要加密的字符串前面加上一些字母數(shù)字符號(hào)或者多次MD5加密,這樣出來的結(jié)果一般是解析不出來的。
MD5的應(yīng)用:
由于MD5加密算法具有較好的安全性,而且免費(fèi),因此該加密算法被廣泛使用
大多數(shù)的'登錄功能向后臺(tái)提交密碼時(shí)都會(huì)使用到這種算法
注意點(diǎn):
(1)一定要和后臺(tái)開發(fā)人員約定好,MD5加密的位數(shù)是16位還是32位(大多數(shù)都是32位的),16位的可以通過32位的轉(zhuǎn)換得到。
(2)MD5加密區(qū)分 大小寫,使用時(shí)要和后臺(tái)約定好。
MD5解密:
解密網(wǎng)站:
為了讓MD5碼更加安全 涌現(xiàn)了很多其他方法 如加鹽。 鹽要足夠長(zhǎng)足夠亂 得到的MD5碼就很難查到。
終端代碼:$ echo -n abc|openssl md5 給字符串a(chǎn)bc加密、
蘋果包裝了MD5加密的方法,使用起來十分的方便。
#import@interface MD5Encrypt : NSObject// MD5加密/**由于MD5加密是不可逆的,多用來進(jìn)行驗(yàn)證*/// 32位小寫+(NSString *)MD5ForLower32Bate:(NSString *)str;// 32位大寫+(NSString *)MD5ForUpper32Bate:(NSString *)str;// 16為大寫+(NSString *)MD5ForUpper16Bate:(NSString *)str;// 16位小寫+(NSString *)MD5ForLower16Bate:(NSString *)str;@end
#import "MD5Encrypt.h"#import@implementation MD5Encrypt#pragma mark - 32位 小寫+(NSString *)MD5ForLower32Bate:(NSString *)str{ //要進(jìn)行UTF8的轉(zhuǎn)碼 const char* input = [str UTF8String]; unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5(input, (CC_LONG)strlen(input), result); NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for (NSInteger i = 0; i CC_MD5_DIGEST_LENGTH; i++) { [digest appendFormat:@"%02x", result[i]]; } return digest;}#pragma mark - 32位 大寫+(NSString *)MD5ForUpper32Bate:(NSString *)str{ //要進(jìn)行UTF8的轉(zhuǎn)碼 const char* input = [str UTF8String]; unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5(input, (CC_LONG)strlen(input), result); NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for (NSInteger i = 0; i CC_MD5_DIGEST_LENGTH; i++) { [digest appendFormat:@"%02X", result[i]]; } return digest;}#pragma mark - 16位 大寫+(NSString *)MD5ForUpper16Bate:(NSString *)str{ NSString *md5Str = [self MD5ForUpper32Bate:str]; NSString *string; for (int i=0; i24; i++) { string=[md5Str substringWithRange:NSMakeRange(8, 16)]; } return string;}#pragma mark - 16位 小寫+(NSString *)MD5ForLower16Bate:(NSString *)str{ NSString *md5Str = [self MD5ForLower32Bate:str]; NSString *string; for (int i=0; i24; i++) { string=[md5Str substringWithRange:NSMakeRange(8, 16)]; } return string;}@end
AES加密有四種工作模式:ECB、CBC、CFB和OFB,其中IOS支持ECB(kCCOptionPKCS7Padding 對(duì)應(yīng)Java中的kCCOptionPKCS5Padding)和CBC(kCCOptionECBMode)
AES是開發(fā)中常用的加密算法之一。然而由于前后端開發(fā)使用的語言不統(tǒng)一,導(dǎo)致經(jīng)常出現(xiàn)前端加密而后端不能解密的情況出現(xiàn)。然而無論什么語言系統(tǒng),AES的算法總是相同的, 因此導(dǎo)致結(jié)果不一致的原因在于 加密設(shè)置的參數(shù)不一致 。于是先來看看在兩個(gè)平臺(tái)使用AES加密時(shí)需要統(tǒng)一的幾個(gè)參數(shù)。
參考:
ios中使用AES128位 ECB模式加密 結(jié)果轉(zhuǎn)換16進(jìn)制
與服務(wù)器通訊的時(shí)候,除了確定密鑰外,加密模式和填充方式也要確定。第一個(gè)例子中,就是使用了kCCOptionPKCS7Padding加密模式,并且有IV(初始向量),而第二個(gè)例子中使用了ECB(沒有補(bǔ)碼方式)。
此外也要注意轉(zhuǎn)碼后的密文是轉(zhuǎn)成16進(jìn)制,還是base64編碼。
參考鏈接:
在大多數(shù)iOS應(yīng)用在開發(fā)者看來,封閉的iOS系統(tǒng)很安全,iOS應(yīng)用也很安全,但事實(shí)上,iOS應(yīng)用沒有我們想象中的安全。如同安卓應(yīng)用,iOS應(yīng)用也面臨著被破解的威脅,存在大量盜版情況,所以開發(fā)者對(duì)此一定要重視起來,應(yīng)用在上市場(chǎng)之前還是要多做些相關(guān)的防護(hù),例如:
1.本地?cái)?shù)據(jù)加密
對(duì)NSUserDefaults,sqlite存儲(chǔ)文件數(shù)據(jù)加密,保護(hù)帳號(hào)和關(guān)鍵信息。
2. URL編碼加密
對(duì)程序中出現(xiàn)的URL進(jìn)行編碼加密,防止URL被靜態(tài)分析
3. 網(wǎng)絡(luò)傳輸數(shù)據(jù)加密
對(duì)客戶端傳輸數(shù)據(jù)提供加密方案,有效防止通過網(wǎng)絡(luò)接口的攔截獲取
4. 方法體,方法名高級(jí)混淆
對(duì)應(yīng)用程序的方法名和方法體進(jìn)行混淆,保證源碼被逆向后無法解析代碼
5. 程序結(jié)構(gòu)混排加密
對(duì)應(yīng)用程序邏輯結(jié)構(gòu)進(jìn)行打亂混排,保證源碼可讀性降到最低
一、簡(jiǎn)單說明
1.說明
在開發(fā)應(yīng)用的時(shí)候,數(shù)據(jù)的安全性至關(guān)重要,而僅僅用POST請(qǐng)求提交用戶的隱私數(shù)據(jù),還是不能完全解決安全問題。
如:可以利用軟件(比如Charles)設(shè)置代理服務(wù)器,攔截查看手機(jī)的請(qǐng)求數(shù)據(jù)
“青花瓷”軟件
因此:提交用戶的隱私數(shù)據(jù)時(shí),一定不要明文提交,要加密處理后再提交
2.常見的加密算法
MD5 SHA DES 3DES RC2和RC4 RSA IDEA DSA AES
3.加密算法的選擇
一般公司都會(huì)有一套自己的加密方案,按照公司接口文檔的規(guī)定去加密
二、MD5
1.簡(jiǎn)單說明
MD5:全稱是Message Digest Algorithm 5,譯為“消息摘要算法第5版”
效果:對(duì)輸入信息生成唯一的.128位散列值(32個(gè)字符)
2.MD5的特點(diǎn)
(1)輸入兩個(gè)不同的明文不會(huì)得到相同的輸出值
(2)根據(jù)輸出值,不能得到原始的明文,即其過程不可逆
3.MD5的應(yīng)用
由于MD5加密算法具有較好的安全性,而且免費(fèi),因此該加密算法被廣泛使用
主要運(yùn)用在數(shù)字簽名、文件完整性驗(yàn)證以及口令加密等方面
4.MD5破解
MD5解密網(wǎng)站:
5.MD5改進(jìn)
現(xiàn)在的MD5已不再是絕對(duì)安全,對(duì)此,可以對(duì)MD5稍作改進(jìn),以增加解密的難度
加鹽(Salt):在明文的固定位置插入隨機(jī)串,然后再進(jìn)行MD5
先加密,后亂序:先對(duì)明文進(jìn)行MD5,然后對(duì)加密得到的MD5串的字符進(jìn)行亂序
總之宗旨就是:黑客就算攻破了數(shù)據(jù)庫,也無法解密出正確的明文
代碼示例:
復(fù)制代碼 代碼如下:
#import "HMViewController.h"
#import "NSString+Hash.h"
#define Salt @"fsdhjkfhjksdhjkfjhkd546783765"
@interface HMViewController ()
@end
@implementation HMViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self digest:@"123"]; //
[self digest:@"abc"];
[self digest:@"456"];
}
/**
* 直接用MD5加密
*/
- (NSString *)digest:(NSString *)str
{
NSString *anwen = [str md5String];
NSLog(@"%@ - %@", str, anwen);
return anwen;
}
/**
* 加鹽
*/
- (NSString *)digest2:(NSString *)str
{
str = [str stringByAppendingString:Salt];
NSString *anwen = [str md5String];
NSLog(@"%@ - %@", str, anwen);
return anwen;
}
/**
* 多次MD5
*/
- (NSString *)digest3:(NSString *)str
{
NSString *anwen = [str md5String];
anwen = [anwen md5String];
NSLog(@"%@ - %@", str, anwen);
return anwen;
}
/**
* 先加密, 后亂序
*/
- (NSString *)digest4:(NSString *)str
{
NSString *anwen = [str md5String];
// 注冊(cè): 123 ---- 2CB962AC59075B964B07152D234B7020
// 登錄: 123 --- 202CB962AC59075B964B07152D234B70
NSString *header = [anwen substringToIndex:2];
NSString *footer = [anwen substringFromIndex:2];
anwen = [footer stringByAppendingString:header];
NSLog(@"%@ - %@", str, anwen);
return anwen;
}
@end
(1)直接使用MD5加密(去MD5解密網(wǎng)站即可破解)
(2)使用加鹽(通過MD5解密之后,很容易發(fā)現(xiàn)規(guī)律)
(3)多次MD5加密(使用MD5解密之后,發(fā)現(xiàn)還是密文,那就接著MD5解密)
(4)先加密,后亂序(破解難度增加)
三、注冊(cè)和驗(yàn)證的數(shù)據(jù)處理過程
1.提交隱私數(shù)據(jù)的安全過程 – 注冊(cè)
2.提交隱私數(shù)據(jù)的安全過程 – 登錄