加密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é)果:
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é)果
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é)果:
我們的方案是這樣的:
將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