【问题标题】:Convert Java public DSA or RSA key to a format which Node understands将 Java 公共 DSA 或 RSA 密钥转换为 Node 可以理解的格式
【发布时间】:2014-01-07 16:41:23
【问题描述】:

我想在 Android 中签署消息并在 Node.js 网络应用中验证签名。

在 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 可以读取的文件?或者如何创建一个可以在两者中使用的密钥对?

【问题讨论】:

    标签: java javascript android node.js cryptography


    【解决方案1】:

    试试下面的代码。

        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](http://rtyley.github.io/spongycastle/)

    【讨论】:

      猜你喜欢
      • 2020-06-08
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多