前言
慶云網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)于2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
軟件開發(fā)過程中,對數(shù)據(jù)進行加密是保證數(shù)據(jù)安全的重要手段,常見的加密有Base64加密和MD5加密。Base64加密是可逆的,MD5加密目前來說一般是不可逆的。
MD5生成的是固定的128bit,即128個0和1的二進制位,而在實際應(yīng)用開發(fā)中,通常是以16進制輸出的,所以正好就是32位的16進制,說白了也就是32個16進制的數(shù)字。
MD5主要特點是 不可逆,相同數(shù)據(jù)的MD5值肯定一樣,不同數(shù)據(jù)的MD5值不一樣(也不是絕對的,但基本是不能一樣的)。
MD5算法還具有以下性質(zhì):
1、壓縮性:任意長度的數(shù)據(jù),算出的MD5值長度都是固定的。
2、容易計算:從原數(shù)據(jù)計算出MD5值很容易。
3、抗修改性:對原數(shù)據(jù)進行任何改動,哪怕只修改1個字節(jié),所得到的MD5值都有很大區(qū)別。
4、弱抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
5、強抗碰撞:想找到兩個不同的數(shù)據(jù),使它們具有相同的MD5值,是非常困難的。
6、MD5加密是不可解密的,但是網(wǎng)上有一些解析MD5的,那個相當(dāng)于一個大型的數(shù)據(jù)庫,通過匹配MD5去找到原密碼。所以,只要在要加密的字符串前面加上一些字母數(shù)字符號或者多次MD5加密,這樣出來的結(jié)果一般是解析不出來的。
MD5的應(yīng)用:
由于MD5加密算法具有較好的安全性,而且免費,因此該加密算法被廣泛使用
大多數(shù)的'登錄功能向后臺提交密碼時都會使用到這種算法
注意點:
(1)一定要和后臺開發(fā)人員約定好,MD5加密的位數(shù)是16位還是32位(大多數(shù)都是32位的),16位的可以通過32位的轉(zhuǎn)換得到。
(2)MD5加密區(qū)分 大小寫,使用時要和后臺約定好。
MD5解密:
解密網(wǎng)站:
為了讓MD5碼更加安全 涌現(xiàn)了很多其他方法 如加鹽。 鹽要足夠長足夠亂 得到的MD5碼就很難查到。
終端代碼:$ echo -n abc|openssl md5 給字符串a(chǎn)bc加密、
蘋果包裝了MD5加密的方法,使用起來十分的方便。
#import@interface MD5Encrypt : NSObject// MD5加密/**由于MD5加密是不可逆的,多用來進行驗證*/// 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{ //要進行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{ //要進行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
集合結(jié)構(gòu) 線性結(jié)構(gòu) 樹形結(jié)構(gòu) 圖形結(jié)構(gòu)
1.1、集合結(jié)構(gòu) 說白了就是一個集合,就是一個圓圈中有很多個元素,元素與元素之間沒有任何關(guān)系 這個很簡單
1.2、線性結(jié)構(gòu) 說白了就是一個條線上站著很多個人。 這條線不一定是直的。也可以是彎的。也可以是值的 相當(dāng)于一條線被分成了好幾段的樣子 (發(fā)揮你的想象力)。 線性結(jié)構(gòu)是一對一的關(guān)系
1.3、樹形結(jié)構(gòu) 說白了 做開發(fā)的肯定或多或少的知道 xml 解析 樹形結(jié)構(gòu)跟他非常類似。也可以想象成一個金字塔。樹形結(jié)構(gòu)是一對多的關(guān)系
1.4、圖形結(jié)構(gòu) 這個就比較復(fù)雜了。他呢 無窮。無邊 無向(沒有方向)圖形機構(gòu) 你可以理解為多對多 類似于我們?nèi)说慕患P(guān)系
數(shù)據(jù)結(jié)構(gòu)的存儲
數(shù)據(jù)結(jié)構(gòu)的存儲一般常用的有兩種 順序存儲結(jié)構(gòu) 和 鏈式存儲結(jié)構(gòu)
2.1 順序存儲結(jié)構(gòu)
發(fā)揮想象力啊。 舉個列子。數(shù)組。1-2-3-4-5-6-7-8-9-10。這個就是一個順序存儲結(jié)構(gòu) ,存儲是按順序的 舉例說明啊。 棧,做開發(fā)的都熟悉。棧是先進后出 ,后進先出的形式 對不對 ?
他的你可以這樣理解, hello world 在棧里面從棧底到棧頂?shù)倪壿嬕来螢? h-e-l-l-o-w-o-r-l-d 這就是順序存儲,再比如隊列 ,隊列是先進先出的對吧,從頭到尾 h-e-l-l-o-w-o-r-l-d 就是這樣排對的
2.2 鏈式存儲結(jié)構(gòu)
再次發(fā)揮想象力 這個稍微復(fù)雜一點 這個圖片我一直弄好 ,回頭找美工問問,再貼上 例如 還是一個數(shù)組 1-2-3-4-5-6-7-8-9-10 鏈式存儲就不一樣了 1(地址)-2(地址)-7(地址)-4(地址)-5(地址)-9(地址)-8(地址)-3(地址)-6(地址)-10(地址)。每個數(shù)字后面跟著一個地址 而且存儲形式不再是順序 ,也就說順序亂了,1(地址) 1 后面跟著的這個地址指向的是 2,2 后面的地址指向的是 3,3 后面的地址指向是誰你應(yīng)該清楚了吧。他執(zhí)行的時候是 1(地址)-2(地址)-3(地址)-4(地址)-5(地址)-6(地址)-7(地址)-8(地址)-9(地址)-10(地址),但是存儲的時候就是完全隨機的。明白了?
單向鏈表\雙向鏈表\循環(huán)鏈表
還是舉例子。理解最重要。不要去死記硬背 哪些什么。定義啊。邏輯啊。理解才是最重要滴
3.1 單向鏈表
A-B-C-D-E-F-G-H . 這就是單向鏈表 H 是頭 A 是尾 像一個只有一個頭的火車一樣 只能一個頭拉著跑
3.2 雙向鏈表
數(shù)組和鏈表區(qū)別:
數(shù)組:數(shù)組元素在內(nèi)存上連續(xù)存放,可以通過下標查找元素;插入、刪除需要移動大量元素,比較適用元素很少變化的情況
鏈表:鏈表中的元素在內(nèi)存中不是順序存儲的,查找慢,插入、刪除只需要對元素指針重新賦值,效率高
3.3 循環(huán)鏈表
循環(huán)鏈表是與單向鏈表一樣,是一種鏈式的存儲結(jié)構(gòu),所不同的是,循環(huán)鏈表的最后一個結(jié)點的指針是指向該循環(huán)鏈表的第一個結(jié)點或者表頭結(jié)點,從而構(gòu)成一個環(huán)形的鏈。發(fā)揮想象力 A-B-C-D-E-F-G-H-A . 繞成一個圈。就像蛇吃自己的這就是循環(huán) 不需要去死記硬背哪些理論知識。
二叉樹/平衡二叉樹
4.1 什么是二叉樹
樹形結(jié)構(gòu)下,兩個節(jié)點以內(nèi) 都稱之為二叉樹 不存在大于 2 的節(jié)點 分為左子樹 右子樹 有順序 不能顛倒 ,懵逼了吧,你肯定會想這是什么玩意,什么左子樹右子樹 ,都什么跟什么鬼? 現(xiàn)在我以普通話再講一遍,你把二叉樹看成一個人 ,人的頭呢就是樹的根 ,左子樹就是左手,右子樹就是右手,左右手可以都沒有(殘疾嘛,聲明一下,絕非歧視殘疾朋友,勿怪,勿怪就是舉個例子, I am very sorry ) , 左右手呢可以有一個,就是不能顛倒。這樣講應(yīng)該明白了吧
二叉樹有五種表現(xiàn)形式
1.空的樹(沒有節(jié)點)可以理解為什么都沒 像空氣一樣
2.只有根節(jié)點。 (理解一個人只有一個頭 其他的什么都沒,說的有點恐怖)
3.只有左子樹 (一個頭 一個左手 感覺越來越寫不下去了)
4.只有右子樹
5.左右子樹都有
二叉樹可以轉(zhuǎn)換成森林 樹也可以轉(zhuǎn)換成二叉樹。這里就不介紹了 你做項目絕對用不到數(shù)據(jù)結(jié)構(gòu)大致介紹這么多吧。理解為主, 別死記,死記沒什么用
1、不用中間變量,用兩種方法交換 A 和 B 的值
2、****求最大公約數(shù)
3、模擬棧操作
棧是一種數(shù)據(jù)結(jié)構(gòu),特點:先進后出 -
練習(xí):使用全局變量模擬棧的操作
#include stdio.h
#include stdbool.h
#include assert.h
//保護全局變量:在全局變量前加 static 后,這個全局變量就只能在本文件中使用 static int data[1024] ;//棧最多能保存 1024 個數(shù)據(jù)
static int count = 0 ;//目前已經(jīng)放了多少個數(shù)(相當(dāng)于棧頂位置)
4、排序算法
選擇排序、冒泡排序、插入排序三種排序算法可以總結(jié)為如下:
都將數(shù)組分為已排序部分和未排序部分。
1.選擇排序?qū)⒁雅判虿糠侄x在左端,然后選擇未排序部分的最小元素和未排序部分的第一個元素交換。
2.冒泡排序?qū)⒁雅判虿糠侄x在右端,在遍歷未排序部分的過程執(zhí)行交換,將最大元素交換到最右端。
3.插入排序?qū)⒁雅判虿糠侄x在左端,將未排序部分元的第一個元素插入到已排序部分合適的位置。
4.1、選擇排序
【選擇排序】:最值出現(xiàn)在起始端
第 1 趟:在 n 個數(shù)中找到最小(大)數(shù)與第一個數(shù)交換位置
第 2 趟:在剩下 n-1 個數(shù)中找到最小(大)數(shù)與第二個數(shù)交換位置
重復(fù)這樣的操作...依次與第三個、第四個...數(shù)交換位置
第 n-1 趟,最終可實現(xiàn)數(shù)據(jù)的升序(降序)排列。
4.2、冒泡排序
【冒泡排序】:相鄰元素兩兩比較,比較完一趟,最值出現(xiàn)在末尾
第 1 趟:依次比較相鄰的兩個數(shù),不斷交換(小數(shù)放前,大數(shù)放后)逐個推進,最值最后出現(xiàn)在第 n 個元素位置
第 2 趟:依次比較相鄰的兩個數(shù),不斷交換(小數(shù)放前,大數(shù)放后)逐個推進,最值最后出現(xiàn)在第 n-1 個元素位置
…… ……
第 n-1 趟:依次比較相鄰的兩個數(shù),不斷交換(小數(shù)放前,大數(shù)放后)逐個推進,最值最后出現(xiàn)在第 2 個元素位置
5、折半查找(二分查找)
折半查找:優(yōu)化查找時間(不用遍歷全部數(shù)據(jù)) 折半查找的原理:
1.數(shù)組必須是有序的
2.必須已知 min 和 max (知道范圍)
// 已知一個有序數(shù)組, 和一個 key , 要求從數(shù)組中找到 key 對應(yīng)的索引位置
字符串反轉(zhuǎn)
給定字符串 " hello,world ",實現(xiàn)將其反轉(zhuǎn)。輸出結(jié)果: dlrow , olleh
序數(shù)組合并
將有序數(shù)組 {1,4,6,7,9} 和 {2,3,5,6,8,9,10,11,12} 合并為{1,2,3,4,5,6,6,7,8,9,9,10,11,12}
HASH 算法
哈希表
例:給定值是字母 a ,對應(yīng) ASCII 碼值是 97,數(shù)組索引下標為 97。
這里的 ASCII 碼,就算是一種哈希函數(shù),存儲和查找都通過該函數(shù),有效地提高查找效率。
在一個字符串中找到第一個只出現(xiàn)一次的字符。如輸入" abaccdeff ",輸出' b '字符( char )是一個長度為 8 的數(shù)據(jù)類型,因此總共有 256 種可能。每個字母根據(jù)其 ASCII 碼值作為數(shù)組下標對應(yīng)數(shù)組種的一個數(shù)字。數(shù)組中存儲的是每個字符出現(xiàn)的次數(shù)。
查找兩個子視圖的共同父視圖
思路:分別記錄兩個子視圖的所有父視圖并保存到數(shù)組中,然后倒序?qū)ふ?直至找到第一個不一樣的父視圖。
求無序數(shù)組中的中位數(shù)
中位數(shù):當(dāng)數(shù)組個數(shù) n 為奇數(shù)時,為 (n + 1)/2 ,即是最中間那個數(shù)字;當(dāng) n 為偶數(shù)時,為 (n/2 + (n/2 + 1))/2 , 即是中間兩個數(shù)字的平均數(shù)。
首先要先去了解一些幾種排序算法: iOS 排序算法
思路:
1.排序算法+中位數(shù)
首先用冒泡排序、快速排序、堆排序、希爾排序等排序算法將所給數(shù)組排序,然后取出其中位數(shù)即可。
2.利用快排思想
1、簡述 SSL 加密的過程用了哪些加密方法,為何這么作?
SSL 加密的過程之前有些過,此處不再贅述。
SSL 加密,在過程中實際使用了 對稱加密 和 非對稱加密 的結(jié)合。
主要的考慮是先使用 非對稱加密 進行連接,這樣做是為了避免中間人攻擊秘鑰被劫持,但是 非對稱加密的效率比較低。所以一旦建立了安全的連接之后,就可以使用輕量的 對稱加密。
2、RSA 非對稱加密
對稱加密[算法]在加密和解密時使用的是同一個秘鑰;而[非對稱加密算法]需要兩個[密鑰]來進行加密和解密,這兩個秘鑰是[公開密鑰]( public key ,簡稱公鑰)和私有密鑰( private key ,簡稱私鑰)。
RSA 加密
與對稱加密[算法]不同,[非對稱加密算法]需要兩個[密鑰]:[公開密鑰]( publickey )和私有密鑰( privatekey )。公開密鑰與私有密鑰是一對,如果用公開密鑰對數(shù)據(jù)進行加密,只有用對應(yīng)的私有密鑰才能解密;如果用私有密鑰對數(shù)據(jù)進行加密,那么只有用對應(yīng)的公開密鑰才能解密。因為加密和解密使用的是兩個不同的[密鑰],所以這種算法叫作[非對稱加密算法]。
RSA**** 加密原理
RSA 是常用的加密模式,其加密原理可用以下的例子進行簡要的論述。
隨機取兩個質(zhì)數(shù)
以上就是本篇所整理的,感謝觀看!
一、簡單說明
1.說明
在開發(fā)應(yīng)用的時候,數(shù)據(jù)的安全性至關(guān)重要,而僅僅用POST請求提交用戶的隱私數(shù)據(jù),還是不能完全解決安全問題。
如:可以利用軟件(比如Charles)設(shè)置代理服務(wù)器,攔截查看手機的請求數(shù)據(jù)
“青花瓷”軟件
因此:提交用戶的隱私數(shù)據(jù)時,一定不要明文提交,要加密處理后再提交
2.常見的加密算法
MD5 SHA DES 3DES RC2和RC4 RSA IDEA DSA AES
3.加密算法的選擇
一般公司都會有一套自己的加密方案,按照公司接口文檔的規(guī)定去加密
二、MD5
1.簡單說明
MD5:全稱是Message Digest Algorithm 5,譯為“消息摘要算法第5版”
效果:對輸入信息生成唯一的.128位散列值(32個字符)
2.MD5的特點
(1)輸入兩個不同的明文不會得到相同的輸出值
(2)根據(jù)輸出值,不能得到原始的明文,即其過程不可逆
3.MD5的應(yīng)用
由于MD5加密算法具有較好的安全性,而且免費,因此該加密算法被廣泛使用
主要運用在數(shù)字簽名、文件完整性驗證以及口令加密等方面
4.MD5破解
MD5解密網(wǎng)站:
5.MD5改進
現(xiàn)在的MD5已不再是絕對安全,對此,可以對MD5稍作改進,以增加解密的難度
加鹽(Salt):在明文的固定位置插入隨機串,然后再進行MD5
先加密,后亂序:先對明文進行MD5,然后對加密得到的MD5串的字符進行亂序
總之宗旨就是:黑客就算攻破了數(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];
// 注冊: 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)先加密,后亂序(破解難度增加)
三、注冊和驗證的數(shù)據(jù)處理過程
1.提交隱私數(shù)據(jù)的安全過程 – 注冊
2.提交隱私數(shù)據(jù)的安全過程 – 登錄
1、 數(shù)據(jù)結(jié)構(gòu) 其實就是數(shù)據(jù)和結(jié)構(gòu),就是一堆數(shù)據(jù)在內(nèi)存中以什么樣的形式存在。
2、 數(shù)據(jù) 在內(nèi)存中的結(jié)構(gòu)分為 邏輯結(jié)構(gòu) 和 物理結(jié)構(gòu) 。
數(shù)據(jù)在內(nèi)存中有4種:集合結(jié)構(gòu), 線性結(jié)構(gòu),樹型結(jié)構(gòu),圖形結(jié)構(gòu)。
冒泡排序是相鄰數(shù)據(jù)進行兩兩比較,假設(shè)升序排序,則一趟排序下來,就會有一個最大數(shù)產(chǎn)生在數(shù)組最末端。因為有 n 個數(shù)據(jù)需要進行比較,而每一趟排序需要遍歷n個數(shù)據(jù),所以時間復(fù)雜度為O(n^2)
快速排序是定下一個基準數(shù)(一般默認定義最左側(cè)數(shù)據(jù)為基準數(shù),可以理解為參照數(shù)),每一趟排序都需要從左(角標 i)右(角標 j)兩側(cè)開始像中間進行排序,因為基準數(shù)定義在左側(cè),一般先從右側(cè)開始向左側(cè)移動,j--;遇到小于基準數(shù)的暫停,左側(cè)開始向右移動,i++;遇到大于基準數(shù)的暫停;然后交換i 和 j 所對應(yīng)的數(shù)據(jù)。當(dāng)i和j相遇的時候,則將相遇值與基準數(shù)進行交換,一趟排序結(jié)束。時間復(fù)雜度是O(log2 n)