碼路,心路,知行合一。
Java加解密
實現方式:JDK實現,CC,BC
JDK提供比較基礎的底層的實現;CC提供一些簡化的操作;BC提供補充
一、Base64加密
非常簡單,加密解密就一個函式。
程式碼如下:
public static void jdkBase64() { try { //加密: BASE64Encoder encoder = new BASE64Encoder(); String encode = encoder.encode(src.getBytes()); System.out.println("encode : " + encode); //解密 BASE64Decoder decoder = new BASE64Decoder(); String decode = new String(decoder.decodeBuffer(encode)); System.out.println("decode : " + decode); } catch (IOException e) { e.printStackTrace(); } } public static void commonsCodesBase64(){ //加密 byte[] encodeBytes = Base64.encodeBase64(src.getBytes()); System.out.println("encode : " + new String(encodeBytes)); //解密 byte[] decodeBytes = Base64.decodeBase64(encodeBytes); System.err.println("decode : " + new String(decodeBytes)); }
二、訊息摘要演算法加密————主要用於驗證資料完整性。
MD(訊息摘要):
public static void jdkMD5(){ try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] md5Bytes = md.digest(src.getBytes()); //把byte陣列轉換為字串 System.out.println("jdkmd5 : " + Hex.encodeHexString(md5Bytes));//CC實現轉換 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } }
SHA(安全雜湊)
JDK實現和MD一樣。
BC實現如下:(Digest類)
public static void bcSHA1() { Digest digest = new SHA1Digest(); digest.update(src.getBytes(), 0, src.getBytes().length); byte[] sha1Bytes = new byte[digest.getDigestSize()]; digest.doFinal(sha1Bytes, 0); System.out.println("bc sha-1 : " + org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes)); }
CC實現最簡單(就是一個DigestUtils的靜態方法):
public static void ccSHA1() {
System.out.println("cc sha1 - 1 :" + DigestUtils.sha1Hex(src.getBytes()));
System.out.println("cc sha1 - 2 :" + DigestUtils.sha1Hex(src));
}
MAC(訊息認證碼)——含有金鑰的雜湊函式演算法
相容MD和SHA的特性,但加入了金鑰。
主要JDK和Bouncy Castle實現。
JDK實現:獲取或定義金鑰(byte[]陣列),Mac類 例項化、初始化、執行。
BC實現:Hmac類 例項化、初始化、執行。
三、對稱加解密
對稱加密指加密和解密使用相同金鑰的加密演算法。這裡將介紹DES、3重DES、AES和PBE幾種常見的對稱加密演算法在Java中的實現。
DES、3DES、AES(金鑰)、PBE(口令和鹽)
DES:
JDK實現:生成並轉換Key;Cipher類的例項化(getInstance)、初始化(init選擇模式與Key);執行(doFinal)加解密。
推薦BC實現方式:Security.addProvider(newBouncyCastleProvider());
然後剩下的程式碼就可以和JDK實現程式碼基本一樣了。
3DES、AES實現基本一樣,所以就不一一介紹。。。
PBE(基於口令的加密)
特點:通過 salt + 口令
實現:初始化鹽;生成口令;Cipher類加解密。
四、非對稱加解密
非對稱加密演算法是一種基於金鑰的保密方法,需要公開金鑰和私有金鑰,在檔案加密、尤其是網銀中應用廣泛。這裡主要介紹非對稱加密演算法的實現過程,DH、RSA和ELGamal等幾種常見的非對稱加密演算法的在Java中的應用。
概念:公鑰、私鑰;
DH(金鑰交換演算法):
程式碼實現有些麻煩
——初始化傳送方金鑰
-KeyPairGenerator :能產生KeyPair
-KeyPair :常用的金鑰載體,稱為金鑰對,分為公鑰PublicKey與私鑰PrivateKey。
-PublicKey
——初始化接收方金鑰
-KeyFactory :金鑰工廠,生成金鑰,通過某種金鑰的規範來還原金鑰
-X509EncodedKeySpec :根據ASN.1進行金鑰編碼
-DHPublicKey :
-DHParameterSpec :遵從DH演算法發引數的集合
-KeyPairGenerator :
-PrivateKey :
——雙髮根據公佈的對方的PublicKey構建本地金鑰,
——構建出來的本地金鑰是一致的
-KeyAgreement :用來提供金鑰一致性協議
-SecretKey :祕密金鑰,對稱
-KeyFactory
-X509EncodedKeySpec
-PublicKey
——加密、解密(利用本地金鑰)
-Cipher :為加密和解密提供密碼功能的類
解釋:
首先,傳送方產生金鑰對,並公開 公鑰;接收方根據這個公鑰產生金鑰對,然後也公開自己的 公鑰。
然後,傳送方根據接收方的 公鑰 產生自己本地的金鑰(本地金鑰一般是採用對稱金鑰),接收方也根據傳送方的 公鑰 產生自己本地的金鑰。其實,這樣雙方產生的本地金鑰是相同的。
最後,雙方就可以利用本地金鑰進行加解密了。
RSA(基於因子分解):程式碼實現較為簡單
初始化金鑰(包含公鑰、金鑰)。
可以利用公鑰加密,私鑰解密;也可以私鑰加密,公鑰解密
使用過程:雙方分別掌握公鑰與私鑰中的一種,然後就可以加密並傳輸資料了。
public static void jdkRSA() {
try {
//1.初始化金鑰
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
System.out.println("Public Key : " + Base64.encodeBase64String(rsaPublicKey.getEncoded()));
System.out.println("Private Key : " + Base64.encodeBase64String(rsaPrivateKey.getEncoded()));
//2.私鑰加密、公鑰解密——加密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("私鑰加密、公鑰解密——加密 : " + Base64.encodeBase64String(result));
//3.私鑰加密、公鑰解密——解密
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
result = cipher.doFinal(result);
System.out.println("私鑰加密、公鑰解密——解密:" + new String(result));
//4.公鑰加密、私鑰解密——加密
x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
result = cipher.doFinal(src.getBytes());
System.out.println("公鑰加密、私鑰解密——加密 : " + Base64.encodeBase64String(result));
//5.公鑰加密、私鑰解密——解密
pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
result = cipher.doFinal(result);
System.out.println("公鑰加密、私鑰解密——解密:" + new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
EIGamal(基於離散因數)
JDK沒有實現,只能利用BC實現。
首先,Security.addProvider(newBouncyCastleProvider());
之後實現類似於RSA。
五.Java實現數字簽名
數字簽名用於鑑別數字資訊,公鑰和私鑰,私鑰對資料簽名,公鑰用於檢驗。
過程為:首先初始化一個金鑰對,在金鑰對的基礎上進行簽名與驗證。
1、RSA:既可以加解密,也可以數字簽名。
初始化金鑰對:KeyPairGenerator、KeyPair、RSAPublic、PSAPrivate;
執行簽名;Signature類
驗證簽名;Signature類
2、DSA(數字簽名演算法)
初始化金鑰對,公鑰、私鑰;
執行簽名,用私鑰簽名;
驗證簽名,用公鑰驗證;
3、ECDSA
微軟序列號便是採用的ECDSA演算法進行的簽名。速度快,強度高,簽名短。
初始化金鑰對;
執行簽名;
驗證簽名
相關推薦
碼路,心路,知行合一。
Java加解密 實現方式:JDK實現,CC,BC JDK提供比較基礎的底層的實現;CC提供一些簡化的操作;BC提供補充 一、Base64加密 非常簡單,加密解密就一個函式。 程式碼如下: public static void jdkBase64() { try {
從“讀萬卷書”到“行萬里路”,如何做到知行合一
生活不是抽象任性的美好暢想,是具體而細微的實際行動。讓自己慢下來,從容做事,優雅生活,這才是生活的最終目的。 ——吳軍 一、我們為什麼要閱讀 現在是一個電子媒體高度發達的時代,尤其內容展示的方式上是非常豐富的。在這種情況下,人真正用來讀文字的時間相對是減少的。 如今,很多人慢慢都
GAMELOFT9----讀萬卷書,行萬里路,知行合一
Deferred物件是由$.Deferred構造的,$.Deferred被實現為簡單工廠模式。 它用來解決JS中的非同步程式設計,它遵循 Common Promise/A 規範。實現此規範的還有 when.js 和 dojo。 $.Deferred作為
近期辦事犯錯總結-知行合一、知在行前-解決問題前,首先要搞清楚問題
審核 blog 部門 pos body 區別 居住 老婆 流程 事件一:辦卡出錯 幫老婆去辦卡。老婆給了辦卡流程,然後按照流程去辦理。 中間跳過很多環節; 在直接辦卡環節,告訴工作人員我要辦卡,工作人員確認“你要辦卡嗎?”,我說是; 結果悲劇出現了,辦卡人員錄入身份證號後告
【知行合一】厚積薄發,格物致知。簡單點,做事的動機簡單點。
關於博主 目前主要學習機器人導航與定位演算法: 基本掌握filter-slam,graph-slam框架,熟悉單目tracking部分的direct method 和 feature method. 熟悉單目mapping部分的深度估計,正在努力學習semi-dense
知行合一
tar 運用 target 客體 王陽明 現實 便是 命題 並行 http://www.baike.com/wiki/知行合一 知行合一,是指客體順應主體,知是指科學知識,行是指人的實踐,知與行的合一,既不是以知來吞並行,認為知便是行,也不是以行來吞並知,認為行便是知。是明
讀書筆記 - 《王陽明大傳:知行合一的心學智慧》
掌握 能夠 價值 介紹 詳細 開始 記得 不知道 信念 已經不記得是什麽時候開始讀這套書,直到今天才終於初步完成,這真是一段艱苦的心靈旅程。 作為陽明學和王陽明研究的大師,作者在書中巨細靡遺的介紹了王陽明有記載的所有活動和事件,摻雜大量原古文和詩文,對於詳細的時間和事件的細
上海世基——知行合一培訓
就是 上海 人做 其實在 python 學習 多人 其他 方法 傑鍋說,90%的人做股票虧錢的原因是沒有知行合一,許許多多的人都是各自有自己的方法選股賣股,但是還是虧錢的,原因就是沒有真正的執行力。 很多人都有使用黃藍帶,但是藍賣並沒有嚴格執行,導致在市場虧錢。虧錢了舍不得
《知行合一 王陽明》讀後感悟
該書作者為度陰山,主要講述了我國明朝時期心學家王陽明(王守仁)的人生歷程和陽明心學的來源及“修煉”法門。通讀全書,給我留下印象最深的幾個詞語是“知行合一”、“致良知”、“心即理”及王陽明晚年對自己心學的歸納“四句教”。陽明心學,用現代的話總結就是用良知的心作為
江南孤鶩——“知行合一”的Software Developer
解決方案 首先,用絕對定位以及z-index將div至於最底部: position: absolute; z-index:-999; 然後,讓絕對定位的div水平居中。使用負外
漫談 · 比知行合一更重要的是意行合一
本文來源於本人微信公眾號:https://mp.weixin.qq.com/s/g8Tdi20gPhyAPq-W_-k6gw 人生修行在於不斷的提升自己的認知,並達到認知和行為的一致性。這就是所謂的知行合一。 知行合一,本就是非常困難的。在於認知的提升
忠信篤敬 知行合一 自強不息 和而不同
lucene學習 Lucene 簡介 Lucene 是一個基於 Java 的全文資訊檢索工具包,它不是一個完整的搜尋應用程式,而是為你的應用程式提供索引和搜尋功能。Lucene 目前是 Apache Jakarta 家族中的一個開源專案。也是目前最為
更上一層樓!(海納百川、自強不息、厚德篤學、知行合一 -- 大連理工大學)
Lucene&Compass搜尋框架 Lucene是一款Apache頂級專案,在全文搜尋方面做得很好。而Compass是基於Lucene的一款二次封裝的更加易用的搜尋框架。我們可以基於這兩個框架做出適合我們自己專案的站內搜
因為專註 所以專業 知行合一
工具 理解 感謝 power 還得 秘書 自己 pow cmd 因為專註 所以專業 知行合一 還有很多WINDOWS 功能 和工具 不知道, 能把系統平臺 學好 已經非常不錯了。 美國的DON JONES 大半輩子 把 CMD 和POWERSHELL 搞清楚 非
洗禮靈魂,修煉python(3)--從一個簡單的print代碼揭露編碼問題,運行原理和語法習慣
比較 編譯 windows 機器 函數 容易 打印字符 出現 無法 前期工作已經準備好後,可以打開IDE編輯器了,你可以選擇python自帶的IDLE,也可以選擇第三方的,這裏我使用pycharm——一個專門為python而生的編譯器 第一個python代碼當然是所有開發語
大神手把手教你寫一個頁面模板引擎,只需20行Javascript代碼!
[1] 表達 最終 strong ice ali 開頭 syntax years 只用20行Javascript代碼就寫出一個頁面模板引擎的大神是AbsurdJS的作者,下面是他分享的全文,轉需。 不知道你有木有聽說過一個基於Javascript的Web頁面預處理器,叫做A
吳恩達實驗(神經網絡和深度學習)第一課第三周,代碼和數據集,親測可運行
HR tps size nac www cond -c 自己 c-c 代碼和數據集已上傳到文件中 應該可以直接下載吧(第一次上傳文件,感覺是),解壓後把文件夾拷貝到jupyter工作空間即可 註:我對下載的代碼的格式稍作了修改,原來定義函數與調用函數在兩個單元格裏,我直
給大家分享一個在Android中獲取驗證碼的倒數計時器,已經封裝好了,直接引用就行。
獲取簡訊驗證碼後,倒數一分鐘,重新獲取 package com.example.tsx.mytest; import android.annotation.SuppressLint; import android.app.Activity; import andro
linux系統中部署項目,驗證碼不能正常顯示,而windows下面的tomcat下運行,驗證碼能正常顯示,之解決辦法
windows 解決辦法 ali -a 修改 不能 項目 clas bsp linux下驗證碼功能不能正常顯示 步驟方法:1、修改${TOMCAT_HOME}/bin/catalina.sh (windows修改catalina.bat)。2、查找到-Djava.io.tm
【 58沈劍 架構師之路】InnoDB,5項最佳實踐,知其所以然
快取講了一個月《快取架構,一篇足夠》。今天,開始寫資料庫。 第一篇,說說MySQL兩個最常用的儲存引擎,MyISAM和InnoDB。照自己的理解,把一些知識點總結出來,不只說知識點,多講“為什麼”。 一、關於count(*) 知識點:MyISAM會直接儲存總行數,InnoDB則不會,需要按