幾種加密方式介紹

一 . MD5

1.簡(jiǎn)單說(shuō)明
MD5:全稱是Message Digest Algorithm 5坐儿,譯為“消息摘要算法第5版”效果:對(duì)輸入信息生成唯一的128位散列值(32個(gè)字符)
2.MD5的特點(diǎn)
(1)對(duì)不同的數(shù)據(jù)加密,得到的結(jié)果是定長(zhǎng)的,MD5對(duì)不同的數(shù)據(jù)進(jìn)行加密,得到的結(jié)果都是32個(gè)字符.
(2)根據(jù)輸出值拴袭,不能得到原始的明文乳蓄,即其過(guò)程不可逆
(3)算法具有較好的安全性,而且免費(fèi)
(4)廣泛使用主要運(yùn)用在數(shù)字簽名微渠、文件完整性驗(yàn)證以及口令加密等方面

MD5用途
    - 口令加密
    - 搜索
將幾個(gè)關(guān)鍵字分別md5,在搜索這幾個(gè)關(guān)鍵字的時(shí)候,不管順序怎么樣,還是會(huì)得到大致相同的搜素結(jié)果鲁森。其實(shí)就是將這幾個(gè)關(guān)鍵字的md5值作一些特殊處理,比如相加振惰。
    - 版權(quán)
        不同的數(shù)據(jù) MD5 是不一樣的歌溉,比如一個(gè)視頻資源,放到服務(wù)器上的時(shí)候骑晶,會(huì)將md5值也放上去保存痛垛。如果是盜版的,md5值是不一樣的透罢。

3.MD5破解MD5解密網(wǎng)站:http://www.cmd5.com

4.如何使MD5加密更安全?
現(xiàn)在密碼學(xué)要求:同樣的算法榜晦,同樣的密碼明文,每次的結(jié)果不一樣(密碼有實(shí)效性)

第一種方式:加鹽(Salt)
在明文的固定位置插入隨機(jī)串羽圃,然后再進(jìn)行MD5
如果鹽是固定的乾胶,鹽有很多人知道(服務(wù)器,前端朽寞,客戶端)识窿,會(huì)被泄漏,不安全

static NSString *salt =@"fadsfdbvcxweioa43$^$^$$#@23123124";
NSString* password = [self.passField.text
stringByAppendingString:salt].md5String;

第二種方式:先加密脑融,后亂序
先對(duì)明文進(jìn)行MD5喻频,然后對(duì)加密得到的MD5串的字符進(jìn)行亂序
第三種方式:HMAC
現(xiàn)在使用的比較廣泛,安全級(jí)別更高,破解難度高肘迎。
但還是有風(fēng)險(xiǎn):每次結(jié)果一致甥温,有可能被暴力破解锻煌。
黑客模擬網(wǎng)絡(luò)請(qǐng)求,不需要真實(shí)密碼姻蚓,也可以獲取登陸權(quán)限宋梧。

給定一個(gè)密鑰(這個(gè)密鑰來(lái)自于服務(wù)器),對(duì)明文進(jìn)行密鑰拼接,并且做"兩次散列" -> 得到32位結(jié)果。
NSString* password = [self.passField.text
hmacMD5StringWithKey:@"hmackey"];

上面代碼 md5 的過(guò)程:使用密鑰hmackey對(duì)密碼加密狰挡,加密后做md5捂龄,得到32位字符串,再次使用 hmackey 加密加叁,再md5

HMAC使用方式 :(登陸注冊(cè)密碼加密)
    - 注冊(cè)時(shí),向服務(wù)器索取密鑰(key)倦沧,服務(wù)器將密鑰和用戶的賬戶對(duì)應(yīng)起來(lái)保存在數(shù)據(jù)庫(kù)。
    - 客戶端拿到key后保存在本地(鑰匙串保存它匕,登陸的時(shí)候需要用到這個(gè)key進(jìn)行加密)
    - 切換了新的設(shè)備(換手機(jī)登錄或者登錄新的已有賬號(hào)) 
 重新找服務(wù)器獲取key展融,服務(wù)器根據(jù)賬號(hào)給(比如qq,第一次登陸會(huì)比較慢,因?yàn)椴粌H要獲取key,還要獲取聊天信息)
eg: 用戶在A設(shè)備登陸成功后超凳,再去B設(shè)備登陸愈污,B從本地找key找不到,就會(huì)找服務(wù)器要(如果有密碼鎖就等待授權(quán)轮傍,如果沒(méi)有密碼鎖暂雹,就直接獲取)创夜,服務(wù)器會(huì)根據(jù)A設(shè)備(授權(quán))決定給不給(密碼鎖杭跪,也是根據(jù)這個(gè)key)
5、生成帶時(shí)間戳的密碼
使用時(shí)間戳驰吓,目前使用非常廣泛
思路:
- 客戶端注冊(cè)時(shí)輸入賬號(hào)和原始密碼涧尿,服務(wù)器會(huì)返回一個(gè)key給客戶端
- 服務(wù)器將賬號(hào),key,以及hmac后的密碼(EncryptPass)保存在數(shù)據(jù)庫(kù)
- 客戶端拿到key后檬贰,會(huì)將原始密碼結(jié)合key進(jìn)行一次hmac運(yùn)算姑廉,生成一個(gè)加密后的密碼(EncryptPass),加密后的密碼再結(jié)合當(dāng)前時(shí)間(這個(gè)時(shí)間要從服務(wù)器獲取)再做一次md5翁涤,生成新的加密密碼(finalPass)
- 客戶端結(jié)合時(shí)間生產(chǎn)密碼后桥言,會(huì)發(fā)送請(qǐng)求和服務(wù)器上的密碼作比較(服務(wù)器會(huì)用EncryptPass結(jié)合服務(wù)器當(dāng)前時(shí)間,或者當(dāng)前時(shí)間前一分鐘葵礼,生產(chǎn)服務(wù)器的finalPass,如果這兩個(gè)時(shí)間相同号阿,就登陸成功)
- 這樣根據(jù)時(shí)間來(lái)做,就算暴力破解或者模擬登陸鸳粉,已經(jīng)過(guò)了時(shí)效了扔涧,密碼早已經(jīng)變了。

(1) ------使用客戶端時(shí)間生成帶時(shí)間戳的密碼------
(NSString *)timePassword{
//1.設(shè)置密鑰key
NSString *key = @"itheima".md5String;
//2.使用密鑰key對(duì)密碼進(jìn)行HMac
NSString *pwd = [self.passField.texthmacMD5StringWithKey:key];
NSLog(@"key = %@",key);
//3.獲得當(dāng)前的系統(tǒng)時(shí)間
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
//指定時(shí)區(qū),真機(jī)通常需要指定時(shí)區(qū)
fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
//設(shè)置時(shí)間格式
fmt.dateFormat = @"yyyy-MM-dd HH:mm";
//格式化當(dāng)前時(shí)間
NSString *dateStr = [fmt stringFromDate:[NSDate date]];
//4.用密碼+ 時(shí)間 生成密碼
pwd =[pwd stringByAppendingString:dateStr];
//5.返回hmac 結(jié)果
return [pwd hmacMD5StringWithKey:key];
}
NSString *password = [self timePassword];
(2) ------使用服務(wù)器時(shí)間,生成帶時(shí)間戳的密碼-----
(NSString *)timePassword{
//1.設(shè)置密鑰key
NSString *key = @"itheima".md5String;
//2.對(duì)密鑰key對(duì)密碼進(jìn)行HMac
NSString *pwd = [self.passField.text hmacMD5StringWithKey:key];
//3.獲得當(dāng)前服務(wù)器的系統(tǒng)時(shí)間
NSURL*url = [NSURL URLWithString:@"[http://localhost/hmackey.php](http://localhost/hmackey.php)"];
//使用同步獲取時(shí)間(注意:這里要使用同步,確定先獲得服務(wù)器的時(shí)間,后面的代碼才能執(zhí)行)
NSData *timeData = [NSData dataWithContentsOfURL:url];
//反序列化取出時(shí)間
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:timeData options:0 error:NULL];
NSString *dateStr = dict[@"key"];
//4.用密碼+ 時(shí)間 生成密碼
pwd =[pwd stringByAppendingString:dateStr];
//5.返回hmac 結(jié)果
return [pwd hmacMD5StringWithKey:key];
}
注意:要獲得服務(wù)器時(shí)間來(lái)對(duì)密碼進(jìn)行hmac枯夜。
有些人手機(jī)上的時(shí)間設(shè)置會(huì)比真實(shí)的時(shí)間的快5分鐘弯汰。如果是這樣的,就會(huì)導(dǎo)致客戶端獲得的系統(tǒng)時(shí)間和服務(wù)器獲得的系統(tǒng)時(shí)間相差幾分鐘卤档。那就會(huì)導(dǎo)致hmac 的結(jié)果不一致蝙泼,無(wú)法登錄。
網(wǎng)絡(luò)開(kāi)發(fā)中劝枣,不管是網(wǎng)絡(luò)傳輸還是在本地都不允許保存用戶的明文隱私數(shù)據(jù)

登陸注冊(cè)時(shí)密碼的處理方式:
用戶注冊(cè)的時(shí)候服務(wù)器對(duì)密碼進(jìn)行了加密處理,然后保存在數(shù)據(jù)庫(kù),服務(wù)器是不需要知道用戶的真實(shí)密碼的织鲸。
登陸的時(shí)候客戶端使用和服務(wù)器相同的加密方式舔腾,然后和服務(wù)器上加密后的密碼比較,來(lái)完成登陸搂擦。

如果android端和mac端有分歧稳诚,可以在mac終端用下面命令來(lái)檢驗(yàn)。
md5 -s "xxxxxxx"

保存密碼的方式:(如果想反算原始密碼)
1.NSUserDefaults
2.鑰匙串訪問(wèn)
- 蘋(píng)果的"生態(tài)圈",從 iOS7.0.3 版本開(kāi)放
- 在Mac上能夠動(dòng)態(tài)生成復(fù)雜密碼(AES 加密)
- 如果用戶訪問(wèn)網(wǎng)站,記住密碼,我們還可以看到記住的密碼明文
- 本身的所有接口都是 C 語(yǔ)言的.借助三方庫(kù)
二. 對(duì)稱加密
*  加密和解密使用同一個(gè)"密鑰"
*  密鑰的保密工作就非常的重要瀑踢,密鑰會(huì)定期更換
經(jīng)典算法
- DES  數(shù)據(jù)加密標(biāo)準(zhǔn)(用的比較少,因?yàn)閺?qiáng)度不夠).
- 3DES 使用3個(gè)密鑰,對(duì)相同的數(shù)據(jù)執(zhí)行三次加密,強(qiáng)度增強(qiáng).
- AES  高級(jí)加密標(biāo)準(zhǔn),目前美國(guó)國(guó)家安全局使用AES加密(鑰匙串訪問(wèn)就是使用AES加密)

對(duì)稱加密有兩種加密方式: ECB和CBC

ECB: 電子代碼本,就是將一個(gè)數(shù)據(jù)拆分為多塊,然后獨(dú)立加密
CBC: 密碼塊鏈,使用一個(gè)密鑰和一個(gè)初始化"向量"對(duì)數(shù)據(jù)執(zhí)行加密轉(zhuǎn)換扳还,能保證密文的完整性,如果一個(gè)數(shù)據(jù)發(fā)生改變,后面所有的數(shù)據(jù)將會(huì)被破壞
向量:某個(gè)方向的數(shù)量.
現(xiàn)代的密碼學(xué)都和幾何有關(guān)!因?yàn)閹缀?包含圓形\橢圓\球體)的變量是有規(guī)律的,但是結(jié)果是多變的

可以在終端通過(guò)命令來(lái)測(cè)試

//ECB加密
openssl enc -des-ecb -K 616263 -nosalt -in xxx.xxx -out XXX.XXX 
//ECB解密   
openssl enc -des-ecb -K 616263 -nosalt -in xxx.xxx -out XXX.XXX -d 
//查看ECB加密之后的文件
$ xxd xxx.xxx  

解釋:
-des-ecb         : 使用ecb方式加密,
-K               : 密鑰匙'abc'(注意:616263是16進(jìn)制的)
-nosalt          : 不加鹽
-in xxx.xxx      : 要加密的文件
-out XXX.XXX     : 生成的加密文件
=============================================================================
//cbc方式加密
echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
解釋:
echo -n hello    :要加密的字符串‘hello’
enc -aes-128-cbc : 使用cbc方式加密
-iv 0102030405060708 :向量是‘12345678’
-K               : 密鑰匙'abc'(注意:616263是16進(jìn)制的)
-nosalt          : 不加鹽
base64           :base64編碼
提示:
1> 加密過(guò)程是先加密橱夭,再base64編碼
2> 解密過(guò)程是先base64解碼氨距,再解密
三. 非對(duì)稱加密(RSA)
公鑰\私鑰(用公鑰加密,私鑰解密或者用私鑰加密,公鑰解密)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棘劣,隨后出現(xiàn)的幾起案子俏让,更是在濱河造成了極大的恐慌,老刑警劉巖茬暇,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件首昔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡糙俗,警方通過(guò)查閱死者的電腦和手機(jī)勒奇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巧骚,“玉大人赊颠,你說(shuō)我怎么就攤上這事⊥欤” “怎么了巨税?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粉臊。 經(jīng)常有香客問(wèn)我草添,道長(zhǎng)扼仲,這世上最難降的妖魔是什么远寸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮驰后,結(jié)果婚禮上肆资,老公的妹妹穿的比我還像新娘灶芝。我一直安慰自己郑原,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布夜涕。 她就那樣靜靜地躺著犯犁,像睡著了一般女器。 火紅的嫁衣襯著肌膚如雪酸役。 梳的紋絲不亂的頭發(fā)上驾胆,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天涣澡,我揣著相機(jī)與錄音,去河邊找鬼丧诺。 笑死入桂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锅必。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搞隐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了劣纲?” 一聲冷哼從身側(cè)響起逢捺,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤癞季,失蹤者是張志新(化名)和其女友劉穎劫瞳,沒(méi)想到半個(gè)月后绷柒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體志于,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡废睦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奈应。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杖挣,靈堂內(nèi)的尸體忽然破棺而出肩榕,到底是詐尸還是另有隱情惩妇,我是刑警寧澤株汉,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布屿附,位于F島的核電站,受9級(jí)特大地震影響挺份,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贮懈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朵你。 院中可真熱鬧,春花似錦抡医、人聲如沸躲因。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)水孩。三九已至镰矿,卻和暖如春俘种,著一層夾襖步出監(jiān)牢的瞬間秤标,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工苍姜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悬包。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屈嗤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開(kāi)發(fā)過(guò)程中饶号,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲(chǔ)茫船、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹(shù)閱讀 2,421評(píng)論 0 6
  • 本文主要介紹移動(dòng)端的加解密算法的分類、其優(yōu)缺點(diǎn)特性及應(yīng)用算谈,幫助讀者由淺入深地了解和選擇加解密算法涩禀。文中會(huì)包含算法的...
    蘋(píng)果粉閱讀 11,502評(píng)論 5 29
  • Java 語(yǔ)言中的 volatile 變量可以被看作是一種 “程度較輕的 synchronized”;與 sync...
    keyu88888閱讀 1,181評(píng)論 2 24
  • 太陽(yáng)遲遲不肯離去 月亮枕著星星 閉上眼睛 風(fēng)掀起了衣襟 頭發(fā)翩翩起舞 我的一半屬于太陽(yáng) 心要照耀在陽(yáng)光下 我的一半...
    妮妮雅閱讀 182評(píng)論 3 5
  • I am too tired today. I have no Time to keep my diary. I ...
    老蠻腰閱讀 179評(píng)論 0 0