2014-01-07 101 views
0

我想在Android中對消息進行簽名並驗證Node.js Web應用程序中的簽名。將Java公共DSA或RSA密鑰轉換爲Node可以識別的格式

在Android方面,我創建的關鍵如下:

KeyPairGenerator generator = KeyPairGenerator.getInstance("DSA"); 
generator.initialize(dsabits, sr); 
KeyPair keyPair = generator.generateKeyPair(); 
PublicKey publicKey = keyPair.getPublic(); 


FileOutputStream fos = new FileOutputStream(filename); 
fos.write(publicKey.getEncoded()); 
fos.close(); 

現在我想用該公鑰來驗證郵件中的Node.js:

var messageBase64 = "SGVsbG8gRmVsaXgh"; 
var signatureBase64 = 'MCwCFF9mV7/m3D8qjJKZSj3JMtqEmCQmAhQk9wSVnyOQgvUd5/n/iGAr4cNxLw==' 
var crypto = require('crypto'); 
var fs = require('fs'); 

var verify = crypto.createVerify('dsaWithSHA'); 
var buffer = new Buffer(messageBase64, 'base64'); 
verify.update(buffer); 
var key = fs.readFileSync('./keys/public.key'); 

var isValid = verify.verify(key, signatureBase64 , 'base64'); 

我如何將Java生成的密鑰文件轉換爲Node可以讀取的文件?或者我怎麼能創建一個我可以在兩個中使用的密鑰對?

回答

0

請嘗試下面的代碼。

PEMWriter writer = new PEMWriter(new FileWriter("test.pem")); 
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
    kpg.initialize(3072); 
    KeyPair keyPair = kpg.generateKeyPair(); 
    writer.writeObject(keyPair.getPublic()); 
    writer.close(); 

我已經使用RSA而不是DSA(DSA密鑰也應該可以工作)。 DSA只能用於傳統應用程序。在Java SE上它甚至限制爲512或1024位的密鑰,這不再被認爲是安全的。如果您的Android API出現故障,請嘗試SpongyCastle

相關問題