導航:首頁 > 編程語言 > javasignature

javasignature

發布時間:2022-12-07 18:18:40

A. java如何對pdf文件實現數字簽名

用Spire.Doc for Java 可以添加及驗證數字簽名,參考代碼:

importcom.spire.pdf.*;
importcom.spire.pdf.graphics.PdfImage;
importcom.spire.pdf.graphics.PdfTrueTypeFont;
importcom.spire.pdf.security.GraphicMode;
importcom.spire.pdf.security.PdfCertificate;
importcom.spire.pdf.security.PdfCertificationFlags;
importcom.spire.pdf.security.PdfSignature;

importjava.awt.*;
importjava.awt.geom.Point2D;
importjava.awt.geom.Rectangle2D;

publicclassAddCertificate{
publicstaticvoidmain(String[]args){
//載入PDF文檔
PdfDocumentdoc=newPdfDocument();
doc.loadFromFile("test.pdf");

//載入pfx證書,及證書秘鑰
PdfCertificatecert=newPdfCertificate("Cermia.pfx","123654yes!");

//添加數字簽名到指定頁面,並設置其位置和大小
PdfSignaturesignature=newPdfSignature(doc,doc.getPages().get(2),cert,"MySignature");
Rectangle2Drect=newRectangle2D.Float();
rect.setFrame(newPoint2D.Float((float)doc.getPages().get(0).getActualSize().getWidth()-340,(float)doc.getPages().get(0).getActualSize().getHeight()-230),newDimension(280,150));
signature.setBounds(rect);

//設置簽名為圖片加文本模式
signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);

//設置簽名的內容
signature.setNameLabel("簽字者:");
signature.setName("Mia");
signature.setContactInfoLabel("聯系電話:");
signature.setContactInfo("02881705109");
signature.setDateLabel("日期:");
signature.setDate(newjava.util.Date());
signature.setLocationInfoLabel("地點:");
signature.setLocationInfo("成都");
signature.setReasonLabel("原因:");
signature.setReason("文檔所有者");
signature.setDistinguishedNameLabel("DN:");
signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());
signature.setSignImageSource(PdfImage.fromFile("sign.png"));

//設置簽名的字體
signature.setSignDetailsFont(newPdfTrueTypeFont(newFont("ArialUnicodeMS",Font.PLAIN,9)));

//設置文檔許可權為禁止更改
signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
signature.setCertificated(true);

//保存文檔
doc.saveToFile("AddSignature.pdf");
doc.close();
}
}

數字簽名添加效果:

數字簽名效果

參考原文

B. java註解怎麼驗證參數和簽名

一般介面為了安全需要,都會這么做。可能你的思路還不明確。我的做法是這樣的,雙方約定好,參數按特定順序排列,比如按首字母的順序排列,如url:http://xxx/xxx.do?a=wersd&b=sd2354&c=4&signature=XXXXXXXXXXXX(signature為傳入的簽名),你拿到入參後,將參數串a=wersd&b=sd2354&c=4按你們約定的簽名規則,自己用md5加簽一次,然後和入參的signature值對比,以確認調用者是否合法,這就是介面簽名驗證的思路。

希望有幫到你,記得採納。

C. java最常用的幾種加密演算法

簡單的Java加密演算法有:
第一種. BASE
Base是網路上最常見的用於傳輸Bit位元組代碼的編碼方式之一,大家可以查看RFC~RFC,上面有MIME的詳細規范。Base編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base來將一個較長的唯一標識符(一般為-bit的UUID)編碼為一個字元串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。
第二種. MD
MD即Message-Digest Algorithm (信息-摘要演算法),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、哈希演算法),主流編程語言普遍已有MD實現。將數據(如漢字)運算為另一固定長度值,是雜湊演算法的基礎原理,MD的前身有MD、MD和MD。
MD演算法具有以下特點:
壓縮性:任意長度的數據,算出的MD值長度都是固定的。
容易計算:從原數據計算出MD值很容易。
抗修改性:對原數據進行任何改動,哪怕只修改個位元組,所得到的MD值都有很大區別。
弱抗碰撞:已知原數據和其MD值,想找到一個具有相同MD值的數據(即偽造數據)是非常困難的。
強抗碰撞:想找到兩個不同的數據,使它們具有相同的MD值,是非常困難的。
MD的作用是讓大容量信息在用數字簽名軟體簽署私人密鑰前被」壓縮」成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進制數字串)。除了MD以外,其中比較有名的還有sha-、RIPEMD以及Haval等。
第三種.SHA
安全哈希演算法(Secure Hash Algorithm)主要適用於數字簽名標准(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於^位的消息,SHA會產生一個位的消息摘要。該演算法經過加密專家多年來的發展和改進已日益完善,並被廣泛使用。該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),並把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。散列函數值可以說是對明文的一種「指紋」或是「摘要」所以對散列值的數字簽名就可以視為對此明文的數字簽名。
SHA-與MD的比較
因為二者均由MD導出,SHA-和MD彼此很相似。相應的,他們的強度和其他特性也是相似,但還有以下幾點不同:
對強行攻擊的安全性:最顯著和最重要的區別是SHA-摘要比MD摘要長 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD是^數量級的操作,而對SHA-則是^數量級的操作。這樣,SHA-對強行攻擊有更大的強度。
對密碼分析的安全性:由於MD的設計,易受密碼分析的攻擊,SHA-顯得不易受這樣的攻擊。
速度:在相同的硬體上,SHA-的運行速度比MD慢。
第四種.HMAC
HMAC(Hash Message Authentication Code,散列消息鑒別碼,基於密鑰的Hash演算法的認證協議。消息鑒別碼實現鑒別的原理是,用公開函數和密鑰產生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數據塊,即MAC,並將其加入到消息中,然後傳輸。接收方利用與發送方共享的密鑰進行鑒別認證等。

D. 請問java中的signature是什麼意思是屬性的意思嗎

簽名。
比如:method signature 方法簽名。
方法參數個數、類型、返回值類型不同,雖然方法名一樣,「簽名」也不同。

E. java的signature類提供了哪些演算法

Signature 類用來為應用程序提供數字簽名演算法功能。數字簽名用於確保數字數據的驗證和完整性。
在所有演算法當中,數字簽名可以是 NIST 標準的 DSA,它使用 DSA 和 SHA-1。可以將使用 SHA-1 消息摘要演算法的 DSA 演算法指定為 SHA1withDSA。如果使用 RSA,對消息摘要演算法則會有多種選擇,因此,可以將簽名演算法指定為 MD2withRSA、MD5withRSA 或 SHA1withRSA。因為沒有默認的演算法名稱,所以必須為其指定名稱。
Signature 對象可用來生成和驗證數字簽名。

F. 兩個問題,1.java中什麼是函數的signature,2.java中什麼是enclosing method

  1. 方法的簽名可以唯一的確定這個函數

方法簽名由方法名稱和一個參數列表(方法的參數的順序和類型)組成

比如: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);
}
};
}

G. 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;
}


請採納!

閱讀全文

與javasignature相關的資料

熱點內容
數控三通編程 瀏覽:298
linux多終端 瀏覽:811
法律寫作pdf 瀏覽:144
國貨哪個品牌最好app 瀏覽:951
看哪個app給錢最多 瀏覽:178
編程靠經驗嗎 瀏覽:759
c教程pdf下載地址 瀏覽:573
製作視頻哪個app有瘦臉功能 瀏覽:649
linux查看線程內存 瀏覽:509
命令行簽名apk 瀏覽:92
網頁照片旋轉源碼 瀏覽:842
QQ會員頭像源碼 瀏覽:263
內核命令行 瀏覽:324
腳本提取源碼器 瀏覽:930
smo源碼 瀏覽:877
為什麼要搭建單獨伺服器 瀏覽:480
編譯器有什麼控制 瀏覽:893
希爾伯特pdf 瀏覽:645
php數組全數字 瀏覽:647
解密塔羅牌小程序源碼 瀏覽:862