對于使用Java來說,和其他編程語言類似,需要有一些分隔符、標(biāo)識(shí)符和關(guān)鍵字,它們要么是用來分割語句,要么是有特殊用途。今天我打算簡單總結(jié)總結(jié),跟大家進(jìn)行分享。
目前廣泛使用的算法有MD4、MD5、SHA-1,jdk對上面都提供了支持,在java中進(jìn)行消息摘要很簡單,java.security.MessageDigest提供了一個(gè)簡易的操作方法:
/**
*MessageDigestExample.java
*Copyright 2005-2-16
*/
import java.security.MessageDigest;
/**
*單一的消息摘要算法,不使用密碼.可以用來對明文消息(如:密碼)隱藏保存
*/
public class MessageDigestExample{
public static void main(String[]args)throws Exception{
if(args.length!=1){
System.err.println("Usage:java MessageDigestExample text");
System.exit(1);
}
byte[]plainText=args[0].getBytes("UTF8");
//使用getInstance("算法")來獲得消息摘要,這里使用SHA-1的160位算法
MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");
System.out.println("\n"+messageDigest.getProvider().getInfo());
//開始使用算法
messageDigest.update(plainText);
System.out.println("\nDigest:");
//輸出算法運(yùn)算結(jié)果
System.out.println(new String(messageDigest.digest(),"UTF8"));
}
}
2.對稱加密:
使用對稱加密的話,首先需要一個(gè)密鑰,可用javax.crypto.KeyGenerator產(chǎn)生一個(gè)密鑰(java.security.Key),然后傳遞給一個(gè)加密工具(javax.crypto.Cipher),該工具再使用相應(yīng)的算法來進(jìn)行加密,以下例子使用AES算法來加密:
/**
*PrivateExmaple.java
*Copyright 2005-2-16
*/
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;
/**
*對稱加解密,消息機(jī)密性
*/
public class PrivateExample{
public static void main(String[]args)throws Exception{
if(args.length!=1){
System.err.println("Usage:java PrivateExample");
System.exit(1);
}
byte[]plainText=args[0].getBytes("UTF8");
//通過KeyGenerator形成一個(gè)key
System.out.println("\nStart generate AES key");
KeyGenerator keyGen=KeyGenerator.getInstance("AES");
keyGen.init(128);
Key key=keyGen.generateKey();
System.out.println("Finish generating DES key");
//獲得一個(gè)加密類Cipher,ECB是加密方式,PKCS5Padding是填充方法
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
System.out.println("\n"+cipher.getProvider().getInfo());
//使用密鑰加密
System.out.println("\nStart encryption:");
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[]cipherText=cipher.doFinal(plainText);
System.out.println("Finish encryption:");
System.out.println(new String(cipherText,"UTF8"));
System.out.println("\nStart decryption:");
cipher.init(Cipher.DECRYPT_MODE,key);
byte[]newPlainText=cipher.doFinal(cipherText);
System.out.println("Finish decryption:");
System.out.println(new String(newPlainText,"UTF8"));
}
}
3.非對稱加解密:
jdk提供了對RSA的支持。
/**
*PublicExample.java
*Copyright 2005-2-16
*/
import java.security.Key;
import javax.crypto.Cipher;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
/**
*一個(gè)簡單的非對稱加密例子,Cipher類使用KeyPairGenerator生成的公鑰和私鑰
*/
public class PublicExample{
public static void main(String[]args)throws Exception{
if(args.length!=1){
System.err.println("Usage:java PublicExample");
System.exit(1);
}
byte[]plainText=args[0].getBytes("UTF8");
//構(gòu)成一個(gè)RSA密鑰
System.out.println("\nStart generating RSA key");
KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair key=keyGen.generateKeyPair();
System.out.println("Finish generating RSA key");
//獲得一個(gè)RSA的Cipher類,使用公鑰加密
Cipher cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
System.out.println("\n"+cipher.getProvider().getInfo());
System.out.println("\nStart encryption");
cipher.init(Cipher.ENCRYPT_MODE,key.getPublic());
byte[]cipherText=cipher.doFinal(plainText);
System.out.println("Finish encryption:");
System.out.println(new String(cipherText,"UTF8"));
//使用私鑰解密
System.out.println("\nStart decryption");
cipher.init(Cipher.DECRYPT_MODE,key.getPrivate());
byte[]newPlainText=cipher.doFinal(cipherText);
System.out.println("Finish decryption:");
System.out.println(new String(newPlainText,"UTF8"));
}
}
4.數(shù)字簽名及驗(yàn)證
java中的java.security.Signature類提供了數(shù)字簽名:
/**
*DigitalSignature2Example.java
*Copyright 2005-2-16
*/
import java.security.Signature;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.SignatureException;
/**
*數(shù)字簽名,使用RSA私鑰對對消息摘要簽名,然后使用公鑰驗(yàn)證
*/
public class DigitalSignature2Example{
public static void main(String[]args)throws Exception{
if(args.length!=1){
System.err.println("Usage:java DigitalSignature2Example");
System.exit(1);
}
byte[]plainText=args[0].getBytes("UTF8");
//形成RSA公鑰對
System.out.println("\nStart generating RSA key");
KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair key=keyGen.generateKeyPair();
System.out.println("Finish generating RSA key");
//使用私鑰簽名
Signature sig=Signature.getInstance("SHA1WithRSA");
sig.initSign(key.getPrivate());
sig.update(plainText);
byte[]signature=sig.sign();
System.out.println(sig.getProvider().getInfo());
System.out.println("\nSignature:");
System.out.println(new String(signature,"UTF8"));
//使用公鑰驗(yàn)證
System.out.println("\nStart signature verification");
sig.initVerify(key.getPublic());
sig.update(plainText);
try{
if(sig.verify(signature)){
System.out.println("Signature verified");
}else System.out.println("Signature failed");
}catch(SignatureException e){
System.out.println("Signature failed");
}
}
}
5.數(shù)字證書。
java是以密鑰庫的形式存儲(chǔ)密鑰和證書的,而密鑰庫就是缺省名稱為.keystore的文件(因此java不能使用USB Key載體的證書),里面的密鑰和證書可以擁有名稱(稱為別名),每個(gè)別名都由唯一的密碼保護(hù)。密鑰庫本身也受密碼保護(hù)。
我們可以使用工具keytool,對密鑰庫進(jìn)行管理,其主要命令如下。
certreq生成證書請求
changealias更改條目的別名
delete刪除條目
exportcert導(dǎo)出證書
genkeypair生成密鑰對
genseckey生成密鑰
gencert根據(jù)證書請求生成證書
importcert導(dǎo)入證書或證書鏈
importkeystore從其他密鑰庫導(dǎo)入一個(gè)或所有條目
keypasswd更改條目的密鑰口令
list列出密鑰庫中的條目
printcert打印證書內(nèi)容
printcertreq打印證書請求的內(nèi)容
printcrl打印CRL文件的內(nèi)容
storepasswd更改密鑰庫的存儲(chǔ)口令
可以看出,雖然不是真正的CA系統(tǒng),但keytool已經(jīng)提供了CA最基本的功能。java提供了KeyStore、X509Certificate等類對密鑰庫和證書進(jìn)行操作:
InputStream inStream=new FileInputStream("c:/certificate.p12");
KeyStore ks=KeyStore.getInstance("PKCS12");
ks.load(inStream,"password".toCharArray());
String alias=ks.aliases().nextElement();
certificate=(X509Certificate)ks.getCertificate(alias);
System.out.println(certificate.getNotAfter());
上面介紹的都是最基本的東西,并不是很難,但有助于大家快速實(shí)現(xiàn)在java中的密碼應(yīng)用開發(fā)。要說明的是,java自帶的密碼實(shí)現(xiàn)類其實(shí)是有限制的,一些復(fù)雜的功能或更高級(jí)算法(如256位的AES)并不支持。因此可以去找一些第三方密碼功能來代替使用。
hive數(shù)據(jù)倉是由美國的Facebook公司開源的,主要是為了解決海量結(jié)構(gòu)日志的數(shù)據(jù)統(tǒng)計(jì)而誕生的。hive數(shù)據(jù)倉主要是基于Hadoop的一個(gè)開源數(shù)據(jù)倉庫工具,也是Hadoop的生態(tài)圈,它不僅可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張表,還有為我們提供SQL查詢語句,容易上手,只要你懂一些MySQL數(shù)據(jù)庫一些基本的SQL語句,你便輕松玩轉(zhuǎn)hive數(shù)據(jù)倉。... [詳情]
各行各業(yè)都在布局大數(shù)據(jù)業(yè)務(wù),企業(yè)對于大數(shù)據(jù)工程師的需求進(jìn)一步提升,而想要入行大數(shù)據(jù)工程師,那么首先需要知道企業(yè)大數(shù)據(jù)工程師都要求寫什么樣的技能。大數(shù)據(jù)工程師,在企業(yè)當(dāng)中可以是一人兼顧,也可以是團(tuán)隊(duì)配合,根據(jù)自己的主營業(yè)務(wù),大數(shù)據(jù)工程師招聘要求各有不同。企業(yè)大數(shù)據(jù)工程師,主要是要基于本公司業(yè)務(wù)去實(shí)現(xiàn)大數(shù)據(jù)開發(fā)和運(yùn)維,從這一點(diǎn)上來看,對于大數(shù)據(jù)技術(shù)的要求是一方面,對于行業(yè)背景的了解是另一方面,兩方面結(jié)... [詳情]
你也要考慮時(shí)間、精力、金錢等各方面的投入情況。學(xué)習(xí)和掌握大數(shù)據(jù)相關(guān)技術(shù)也非一朝一夕之事,不可能一蹴而就,一般的培訓(xùn)課程只能達(dá)到入門級(jí)別的介紹和講解,真正要并很好地運(yùn)用大數(shù)據(jù)技術(shù)你還需要后續(xù)更深入的學(xué)習(xí)和大量的實(shí)踐。所以需要你一個(gè)良好的學(xué)習(xí)規(guī)劃。... [詳情]
對于使用Java來說,和其他編程語言類似,需要有一些分隔符、標(biāo)識(shí)符和關(guān)鍵字,它們要么是用來分割語句,要么是有特殊用途。今天我打算簡單總結(jié)總結(jié),跟大家進(jìn)行分享。... [詳情]
今天介紹一下在java中如何進(jìn)行密碼應(yīng)用開發(fā)。相關(guān)密碼學(xué)概念及背景知識(shí)可參考前面的文章,本文不做過多介紹。... [詳情]
青島東軟睿道通過線上線下教學(xué)模式的結(jié)合,為更符合信息產(chǎn)業(yè)發(fā)展需要的大學(xué)生,畢業(yè)生和社會(huì)個(gè)體提供信息技術(shù)技能培訓(xùn)服務(wù),精準(zhǔn)提升大學(xué)生創(chuàng)業(yè)技能,畢業(yè)生和社會(huì)需求者.... [詳情]