網(wǎng)絡(luò)安全之數(shù)據(jù)加密(DES、AES、RSA、MD5)

加密demo 
  剛到公司時,我的工作就是為app端提供相應(yīng)的接口。之前app使用的是PHP接口,對數(shù)據(jù)加密方面做得比較少。到使用java接口時,老大開始讓我們使用DES加密,進行數(shù)據(jù)傳輸,但是后來覺得DES是對稱加密,密鑰存在客戶端不安全,后來就讓使用RSA加密:將公鑰存在客戶端,私鑰存放在服務(wù)端.這樣也就產(chǎn)生了一個問題:雖然客戶端發(fā)送的加密數(shù)據(jù),服務(wù)端可以解密,但服務(wù)端返回的加密數(shù)據(jù),我們客戶端沒有找到公鑰解密算法!而且非對稱加密的RSA加密效率較低,一次加密的數(shù)據(jù)大小也很局限!
  后來,我和ios的哥們商量了一個方案:客戶端傳遞的參數(shù)使用RSA公鑰加密,另外隨機生成一個8位desKey使用RSA公鑰加密傳遞給服務(wù)端;服務(wù)端使用私鑰解密參數(shù)及DES密碼,再將客戶端需要的數(shù)據(jù)使用desKey進行DES加密后返回給客戶端。這樣既能保證數(shù)據(jù)安全,又能提高加密效率!后來老大采用了我們的方案。

下面演示一下DES、AES及RSA的使用:

1.演示DES使用:

<pre class=”brush: java; gutter: true;”>
String plaintext = "hahaGG123哈哈";
String ciphertext = DES.encryptDES(plaintext, DES.PASSWORD_CRYPT_KEY);
System.out.println("明文:" + plaintext);
System.out.println("密鑰:" + DES.PASSWORD_CRYPT_KEY);
System.out.println("密文:" + ciphertext);
System.out.println("解密后:" + DES.decryptDES(ciphertext, DES.PASSWORD_CRYPT_KEY));
</pre>
執(zhí)行結(jié)果:

DES演示結(jié)果

2.演示AES使用:

<pre class=”brush: java; gutter: true;”>
String content = "Hello!12345你好";
String password = "12345678";
//加密
System.out.println("加密前:" + content);
String ciphertext = encryptByPassword(content, password);
System.out.println("加密后:"+ciphertext);
//解密
String decryptResult =decryptByPassword(ciphertext,password);
System.out.println("解密后:" + decryptResult);
</pre>
執(zhí)行結(jié)果

AES演示結(jié)果

3.演示RSA使用:

其實RSA的公鑰和私鑰是等價的,并沒有嚴格的區(qū)分,一般自己保留的為私鑰,給對方使用的為公鑰!
<pre class=”brush: java; gutter: true;”>
//測試字符串
String encryptStr= "12345678";
try {
System.out.println("=============私鑰加密,公鑰解密===============");
//私鑰加密
System.out.println("明文:"+encryptStr);
long encryptstart = System.currentTimeMillis();
String cipherStr = encryptByPrivateKey(encryptStr);
System.out.println("私鑰加密密文:"+cipherStr);
long encryptend = System.currentTimeMillis();
System.out.println("encrypt use time:"+(encryptend-encryptstart)+"ms");
//公鑰鑰解密
long decryptstart = System.currentTimeMillis();
String plaineText = decryptByPublicKey(cipherStr);
System.out.println("解密:"+plaineText);
long decryptend = System.currentTimeMillis();
System.out.println("decrypt use time:"+(decryptend-decryptstart)+"ms");
System.out.println("=============公鑰加密,私鑰解密!===============");
//公鑰加密
System.out.println("明文:"+encryptStr);
encryptstart = System.currentTimeMillis();
cipherStr = encryptByPublicKey(encryptStr);
System.out.println("公鑰加密密文:"+cipherStr);
encryptend = System.currentTimeMillis();
System.out.println("encrypt use time:"+(encryptend-encryptstart)+"ms");
//私鑰解密
decryptstart = System.currentTimeMillis();
plaineText = decryptByPrivateKey(cipherStr);
System.out.println("解密:"+plaineText);
decryptend = System.currentTimeMillis();
System.out.println("decrypt use time:"+(decryptend-decryptstart)+"ms");
System.out.println("===========獲取私鑰公鑰============");
genKeyPair();//獲取密鑰對
}catch(Exception e){
e.printStackTrace();
}
</pre>
執(zhí)行結(jié)果:

RSA加密演示結(jié)果

我們的方案是這樣的:

將Des和Rsa結(jié)合使用:將desKey及關(guān)鍵字段(用戶id等)使用rsa公鑰加密,傳到服務(wù)器,服務(wù)器使用rsa私鑰解密,獲得desKey及用戶id等,并根據(jù)id查找用戶余額,使用des加密后返回給客戶端!
<pre class=”brush: java; gutter: true;”>
@RequestMapping("testRsaAndDes.do")
@ResponseBody
public TotalNote testRsaAndDes(String userId,String desKey){
System.out.println("收到請求!");
TotalNote note = new TotalNote();
try{
System.out.println(userId);
//使用私鑰解密
userId = RSA.decryptByPrivateKey(userId);
desKey = RSA.decryptByPrivateKey(desKey);
//查找數(shù)據(jù)庫獲取用戶,賬戶余額等關(guān)鍵字段,使用des進行加密
String account = "10000.0";
account = DES.encryptDES(account, desKey);
note.setError_code(StatusCode.SUCCESS_CODE);
note.setError_message("獲取數(shù)據(jù)成功!");
note.setData(account);
return note;
}catch(Exception e){
e.printStackTrace();
note.setError_code(StatusCode.ERROR_CODE);
note.setError_message(StatusCode.ERROR_MESSAGE);
return note;
}
}
</pre>
我將代碼整理了一下,放在了我的github上了,歡迎下載,記得給顆星。https://github.com/watermin/RsaDemo
另外想看ios實現(xiàn)DES、AES、RSA加密的可以看看我同事的這個:http://www.lxweimin.com/p/8fd8306a95d0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

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