java的signature
public abstract class RSACoder extends Coder {public static final String KEY_ALGORITHM = "RSA";public static final String SIGNATURE_ALGORITHM = "MD5withRSA";private static final String PUBLIC_KEY = "RSAPublicKey";private static final String PRIVATE_KEY = "RSAPrivateKey";/*** 用私鑰對信息生成數字簽名* * @param data 加密數據* @param privateKey* 私鑰* * @return* @throws Exception*/public static String sign(byte[] data, String privateKey) throws Exception {// 解密由base64編碼的私鑰byte[] keyBytes = decryptBASE64(privateKey);// 構造PKCS8EncodedKeySpec對象PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密演算法KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取私鑰匙對象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 用私鑰對信息生成數字簽名Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(priKey);signature.update(data);return encryptBASE64(signature.sign());}/*** 校驗數字簽名* * @param data* 加密數據* @param publicKey* 公鑰* @param sign* 數字簽名* * @return 校驗成功返回true 失敗返回false* @throws Exception* */public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {// 解密由base64編碼的公鑰byte[] keyBytes = decryptBASE64(publicKey);// 構造X509EncodedKeySpec對象X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密演算法KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取公鑰匙對象PublicKey pubKey = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initVerify(pubKey);signature.update(data);// 驗證簽名是否正常return signature.verify(decryptBASE64(sign));}/*** 解密<br>* 用私鑰解密* * @param data* @param key* @return* @throws Exception*/public static byte[] decryptByPrivateKey(byte[] data, String key)throws Exception {// 對密鑰解密byte[] keyBytes = decryptBASE64(key);// 取得私鑰PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);// 對數據解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 解密<br>* 用公鑰解密* * @param data* @param key* @return* @throws Exception*/public static byte[] decryptByPublicKey(byte[] data, String key)throws Exception {// 對密鑰解密byte[] keyBytes = decryptBASE64(key);// 取得公鑰X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicKey = keyFactory.generatePublic(x509KeySpec);// 對數據解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** 加密<br>* 用公鑰加密* * @param data* @param key* @return* @throws Exception*/public static byte[] encryptByPublicKey(byte[] data, String key)throws Exception {// 對公鑰解密byte[] keyBytes = decryptBASE64(key);// 取得公鑰X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicKey = keyFactory.generatePublic(x509KeySpec);// 對數據加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** 加密<br>* 用私鑰加密* * @param data* @param key* @return* @throws Exception*/public static byte[] encryptByPrivateKey(byte[] data, String key)throws Exception {// 對密鑰解密byte[] keyBytes = decryptBASE64(key);// 取得私鑰PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);// 對數據加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 取得私鑰* * @param keyMap* @return* @throws Exception*/public static String getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return encryptBASE64(key.getEncoded());}/*** 取得公鑰* * @param keyMap* @return* @throws Exception*/public static String getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return encryptBASE64(key.getEncoded());}/*** 初始化密鑰* * @return* @throws Exception*/public static Map<String, Object> initKey() throws Exception {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGen.initialize(1024);KeyPair keyPair = keyPairGen.generateKeyPair();// 公鑰RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();// 私鑰RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();Map<String, Object> keyMap = new HashMap<String, Object>(2);keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}}
② 請教java.security.signature類對word文件進行數字簽名的常式
package cn.rain.main;
import java.io.File;
import java.io.IOException;
public class TT {
/**
* @param args
*/
public static void main(String[] args) {
try {
Runtime.getRuntime().exec("C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE aa.doc");
} catch (IOException e) {
// TODO 自動生成 catch 塊
e.printStackTrace();
}
}
}
你的WORD安裝路徑C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE空格後所加的aa.doc為你的文檔文件名(有文件名重復的,路徑,寫法和安裝路徑的寫法一樣)
或者用Runtime.getRuntime().exec("cmd /c \"C:\\temp\\the list.doc\"");
也可以運行
③ 基於java語言的數字簽名
Java加密和數字簽名編程快速入門
本文主要談一下密碼學中的加密和數字簽名,以及其在java中如何進行使用。對密碼學有興趣的夥伴,推薦看Bruce Schneier的著作:Applied Crypotography。在jdk1.5的發行版本中安全性方面有了很大的改進,也提供了對RSA演算法的直接支持,現在我們從實例入手解決問題(本文僅是作為簡單介紹):
一、密碼學上常用的概念
1)消息摘要:
這是一種與消息認證碼結合使用以確保消息完整性的技術。主要使用單向散列函數演算法,可用於檢驗消息的完整性,和通過散列密碼直接以文本形式保存等,目前廣泛使用的演算法有MD4、MD5、SHA-1,jdk1.5對上面都提供了支持,在java中進行消息摘要很簡單, java.security.MessageDigest提供了一個簡易的操作方法:
/**
*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:");
//輸出演算法運算結果
System.out.println(new String(messageDigest.digest(),"UTF8"));
}
}
還可以通過消息認證碼來進行加密實現,javax.crypto.Mac提供了一個解決方案,有興趣者可以參考相關API文檔,本文只是簡單介紹什麼是摘要演算法。
2)私鑰加密:
消息摘要只能檢查消息的完整性,但是單向的,對明文消息並不能加密,要加密明文的消息的話,就要使用其他的演算法,要確保機密性,我們需要使用私鑰密碼術來交換私有消息。
這種最好理解,使用對稱演算法。比如:A用一個密鑰對一個文件加密,而B讀取這個文件的話,則需要和A一樣的密鑰,雙方共享一個私鑰(而在web環境下,私鑰在傳遞時容易被偵聽):
使用私鑰加密的話,首先需要一個密鑰,可用javax.crypto.KeyGenerator產生一個密鑰(java.security.Key),然後傳遞給一個加密工具(javax.crypto.Cipher),該工具再使用相應的演算法來進行加密,主要對稱演算法有:DES(實際密鑰只用到56位),AES(支持三種密鑰長度:128、192、256位),通常首先128位,其他的還有DESede等,jdk1.5種也提供了對對稱演算法的支持,以下例子使用AES演算法來加密:
/**
*PrivateExmaple.java
*Copyright 2005-2-16
*/
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;
/**
*私鈅加密,保證消息機密性
*/
public class PrivateExample{
public static void main(String[] args) throws Exception{
if(args.length!=1){
System.err.println("Usage:java PrivateExample <text>");
System.exit(1);
}
byte[] plainText=args[0].getBytes("UTF8");
//通過KeyGenerator形成一個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");
//獲得一個私鈅加密類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)公鑰加密:
上面提到,私鑰加密需要一個共享的密鑰,那麼如何傳遞密鑰呢?web環境下,直接傳遞的話很容易被偵聽到,幸好有了公鑰加密的出現。公鑰加密也叫不對稱加密,不對稱演算法使用一對密鑰對,一個公鑰,一個私鑰,使用公鑰加密的數據,只有私鑰能解開(可用於加密);同時,使用私鑰加密的數據,只有公鑰能解開(簽名)。但是速度很慢(比私鑰加密慢100到1000倍),公鑰的主要演算法有RSA,還包括Blowfish,Diffie-Helman等,jdk1.5種提供了對RSA的支持,是一個改進的地方:
/**
*PublicExample.java
*Copyright 2005-2-16
*/
import java.security.Key;
import javax.crypto.Cipher;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
/**
*一個簡單的公鈅加密例子,Cipher類使用KeyPairGenerator生成的公鈅和私鈅
*/
public class PublicExample{
public static void main(String[] args) throws Exception{
if(args.length!=1){
System.err.println("Usage:java PublicExample <text>");
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");
//獲得一個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)數字簽名:
數字簽名,它是確定交換消息的通信方身份的第一個級別。上面A通過使用公鑰加密數據後發給B,B利用私鑰解密就得到了需要的數據,問題來了,由於都是使用公鑰加密,那麼如何檢驗是A發過來的消息呢?上面也提到了一點,私鑰是唯一的,那麼A就可以利用A自己的私鑰進行加密,然後B再利用A的公鑰來解密,就可以了;數字簽名的原理就基於此,而通常為了證明發送數據的真實性,通過利用消息摘要獲得簡短的消息內容,然後再利用私鑰進行加密散列數據和消息一起發送。java中為數字簽名提供了良好的支持,java.security.Signature類提供了消息簽名:
/**
*DigitalSignature2Example.java
*Copyright 2005-2-16
*/
import java.security.Signature;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.SignatureException;
/**
*數字簽名,使用RSA私鑰對對消息摘要簽名,然後使用公鈅驗證 測試
*/
public class DigitalSignature2Example{
public static void main(String[] args) throws Exception{
if(args.length!=1){
System.err.println("Usage:java DigitalSignature2Example <text>");
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"));
//使用公鈅驗證
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)數字證書。
還有個問題,就是公鑰問題,A用私鑰加密了,那麼B接受到消息後,用A提供的公鑰解密;那麼現在有個討厭的C,他把消息攔截了,然後用自己的私鑰加密,同時把自己的公鑰發給B,並告訴B,那是A的公鑰,結果....,這時候就需要一個中間機構出來說話了(相信權威,我是正確的),就出現了Certificate Authority(也即CA),有名的CA機構有Verisign等,目前數字認證的工業標準是:CCITT的X.509:
數字證書:它將一個身份標識連同公鑰一起進行封裝,並由稱為認證中心或 CA 的第三方進行數字簽名。
密鑰庫:java平台為你提供了密鑰庫,用作密鑰和證書的資源庫。從物理上講,密鑰庫是預設名稱為 .keystore 的文件(有一個選項使它成為加密文件)。密鑰和證書可以擁有名稱(稱為別名),每個別名都由唯一的密碼保護。密鑰庫本身也受密碼保護;您可以選擇讓每個別名密碼與主密鑰庫密碼匹配。
使用工具keytool,我們來做一件自我認證的事情吧(相信我的認證):
1、創建密鑰庫keytool -genkey -v -alias feiUserKey -keyalg RSA 默認在自己的home目錄下(windows系統是c:\documents and settings\<你的用戶名> 目錄下的.keystore文件),創建我們用 RSA 演算法生成別名為 feiUserKey 的自簽名的證書,如果使用了-keystore mm 就在當前目錄下創建一個密鑰庫mm文件來保存密鑰和證書。
2、查看證書:keytool -list 列舉了密鑰庫的所有的證書
也可以在dos下輸入keytool -help查看幫助。
④ java 怎麼實現sign校驗
/**
*對Controller進行安全和身份校驗
*/
@Around("within(@org.springframework.stereotype.Controller*)&&@annotation(is)")
(ProceedingJoinPointpjp,SecureValidis)
throwsException{
Object[]args=pjp.getArgs();
//Controller中所有方法的參數,前兩個分別為:Request,Response
HttpServletRequestrequest=(HttpServletRequest)args[0];
//HttpServletResponseresponse=(HttpServletResponse)args[1];
Stringappid=request.getParameter("appid");
intapp_id=Integer.valueOf(appid);
Stringsignature=request.getParameter("signature");
StringclientSignature=request.getParameter("client_signature");
Stringuri=request.getRequestURI();
Stringprovider=request.getParameter("provider");
if(StringUtils.isEmpty(provider)){
provider="passport";
}
//對appid和signature進行校驗
try{
appService.validateAppid(app_id);
booleanisValid=accountService.validSignature(app_id,signature,clientSignature);
if(!isValid)thrownewProblemException(ErrorUtil.ERR_CODE_COM_SING);
}catch(Exceptione){
returnhandleException(e,provider,uri);
}
//繼續執行接下來的代碼
ObjectretVal=null;
try{
retVal=pjp.proceed();
}catch(Throwablee){
if(einstanceofException){returnhandleException((Exception)e,provider,uri);}
}
//目前的介面走不到這里
returnretVal;
}
請採納!
⑤ Java如何生成支付寶RSA2簽名
對支付寶進行設置再回主頁面進行轉義,具體步驟如下。
⑥ 兩個問題,1.java中什麼是函數的signature,2.java中什麼是enclosing method
方法的簽名可以唯一的確定這個函數
方法簽名由方法名稱和一個參數列表(方法的參數的順序和類型)組成
比如:void test();和void test(int i)是兩個不同的方法,但是int test()和float test()是相同的,java會報錯的,因為同個類中有兩個相同的方法
下面僅僅測試如果返回值不同的情況,如果是參數列表和方法名不同,它們是不同的方法,沒有什麼好測試的:
publicclassTest{
//Duplicatemethodtest()intypeTest
publicvoidtest(){}
publicinttest(){}
}
測試一下如果繼承的子類的返回類型是不同,結果如何:
publicclassTest{
publicvoidtest(){}
}
看看子類的情況:
publicclassSubTestextendsTest{
//.test()
floattest(){}
}
2.JAVA中的閉包。
在JAVA中,閉包是通過「介面+內部類」實現,像C#的delegate一樣,JAVA的內部類也可以有匿名內部類。我們現在就來詳細認識一下JAVA內部類。
1、內部類。
顧名思義,內部類就是將一個類定義在另一個類的內部。在JAVA中,內部類可以訪問到外圍類的變數、方法或者其它內部類等所有成員,即使它被定義成private了,但是外部類不能訪問內部類中的變數。這樣通過內部類就可以提供一種代碼隱藏和代碼組織的機制,並且這些被組織的代碼段還可以自由的訪問到包含該內部類的外圍上下文環境。
這里提供了一個例子展示這種機制:
publicinterfaceILog{
publicvoidWrite(Stringmessage);
}
publicclassDemoClass1{
privateintlength=0;
//private|public
{
@Override
publicvoidWrite(Stringmessage){
//DemoClass1.this.length=message.length();
length=message.length();
System.out.println("DemoClass1.InnerClass:"+length);
}
}
publicILoglogger(){
returnnewInnerClass();
}
publicstaticvoidmain(String[]args){
DemoClass1demoClass1=newDemoClass1();
demoClass1.logger().Write("abc");
//.new
DemoClass1dc1=newDemoClass1();
InnerClassic=dc1.newInnerClass();
ic.Write("abcde");
}
}
如果你用過javascript的,肯定是很不喜歡這種模仿的實現
1.2、.this
如何通過this顯式引用外圍類的變數?通過此格式進行引用:{外圍類名}.this.{變數名稱}。如:
DemoClass1.this.length = message.length();
2、局部內部類。
局部內部類是指在方法的作用域內定義的的內部類。
publicclassDemoClass2{
privateintlength=0;
publicILoglogger(){
//在方法體的作用域中定義此局部內部類
classInnerClassimplementsILog
{
@Override
publicvoidWrite(Stringmessage){
length=message.length();
System.out.println("DemoClass2.InnerClass:"+length);
}
}
returnnewInnerClass();
}
}
因為InnerClass類是定義在logger()方法體之內,所以InnerClass類在方法的外圍是不可見的。
3、匿名內部類。
顧名思義,匿名內部類就是匿名、沒有名字的內部類,通過匿名內部類可以更加簡潔的創建一個內部類。
publicclassDemoClass3{
privateintlength=0;
publicILoglogger(){
returnnewILog(){
@Override
publicvoidWrite(Stringmessage){
length=message.length();
System.out.println("DemoClass3.AnonymousClass:"+length);
}
};
}
}
由此可見,要創建一個匿名內部類,可以new關鍵字來創建。
格式:new 介面名稱(){}
格式:new 介面名稱(args...){}
4、final關鍵字。
閉包所綁定的本地變數必須使用final修飾符,以表示為一個恆定不變的數據,創建後不能被更改。
publicclassDemoClass4{
privateintlength=0;
publicILoglogger(intlevel){//finalintlevel
//final
finalintlogLevel=level+1;
switch(level)
{
case1:
returnnewILog(){
@Override
publicvoidWrite(Stringmessage){
length=message.length();
System.out.println("DemoClass4.AnonymousClass:InfoLog"+length);
System.out.println(logLevel);
}
};
default:
returnnewILog(){
@Override
publicvoidWrite(Stringmessage){
length=message.length();
System.out.println("DemoClass4.AnonymousClass:ErrorLog"+length);
System.out.println(logLevel);
}
};
}
}
publicstaticvoidmain(String[]args){
DemoClass4demoClass4=newDemoClass4();
demoClass4.logger(1).Write("abcefghi");
}
}
從例子中可以看到,logger方法接受了一個level參數,以表示要寫的日誌等級,這個level參數如果直接賦給內部類中使用,會導致編譯時錯誤,提示level參數必須為final,這種機制防止了在閉包共享中變數取值錯誤的問題。解決方法可以像例子一樣在方法體內定義一下新的局部變數,標記為final,然後把參數level賦值給它:
final int logLevel = level;
或者直接參數中添加一個final修飾符:
public ILog logger(finalint level {
5、實例初始化。
匿名類的實例初始化相當於構造器的作用,但不能重載。
publicILoglogger(finalintlevel)throwsException{
returnnewILog(){
{
//實例初始化,不能重載
if(level!=1)
thrownewException("日誌等級不正確!");
}
@Override
publicvoidWrite(Stringmessage){
length=message.length();
System.out.println("DemoClass5.AnonymousClass:"+length);
}
};
}
⑦ java怎樣實現手寫簽章
熟練使用各種數據結構和演算法,數組、哈希、鏈表、排序樹…,一句話要麼是時間換空間要麼是空間換時間,這里展開可以說一大堆,需要有一定的應用經驗,用於解決各種性能或業務上的問題。
熟練使用linux操作系統,必備,沒什麼好說的 。
熟悉tcp協議,創建連接三次握手和斷開連接四次握手的整個過程,不了解的話,無法對高並發網路應用做優化; 熟悉http協議,尤其是http頭,我發現好多工作五年以上的都弄不清session和cookie的生命周期以及它們之間的關聯。
系統集群、負載均衡、反向代理、動靜分離,網站靜態化 。
分布式存儲系統nfs,fastdfs,tfs,Hadoop了解他們的優缺點,適用場景 。
分布式緩存技術memcached,redis,提高系統性能必備,一句話,把硬碟上的內容放到內存里來提速,順便提個演算法一致性hash 。
工具nginx必備技能超級好用,高性能,基本不會掛掉的伺服器,功能多多,解決各種問題。
資料庫的設計能力,mysql必備,最基礎的資料庫工具,免費好用,對它基本的參數優化,慢查詢日誌分析,主從復制的配置,至少要成為半個mysql dba。其他nosql資料庫如mongodb。
⑧ java的signature類提供了哪些演算法
Signature 類用來為應用程序提供數字簽名演算法功能。數字簽名用於確保數字數據的驗證和完整性。
在所有演算法當中,數字簽名可以是 NIST 標準的 DSA,它使用 DSA 和 SHA-1。可以將使用 SHA-1 消息摘要演算法的 DSA 演算法指定為 SHA1withDSA。如果使用 RSA,對消息摘要演算法則會有多種選擇,因此,可以將簽名演算法指定為 MD2withRSA、MD5withRSA 或 SHA1withRSA。因為沒有默認的演算法名稱,所以必須為其指定名稱。
Signature 對象可用來生成和驗證數字簽名。
⑨ 請問java中的signature是什麼意思是屬性的意思嗎
簽名。
比如:method signature 方法簽名。
方法參數個數、類型、返回值類型不同,雖然方法名一樣,「簽名」也不同。