2014-01-07 61 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

相关问题