如何在数字签名中验证我的数据?

时间:2014-04-26 11:36:00

标签: java digital-signature verify

我需要在数字签名中验证我的数据到数据,我如何比较它们。 在此代码中验证签名,该签名由公钥和原始签名解密。

  1. 生成公钥和privet密钥以及签名。
  2. 阅读我的数据。
  3. 哈希这段代码。
  4. 阅读签名。
  5. 签名和我的数据之间的比较//我在这个步骤中遇到问题我想比较我的数据和签名。

     public static void verify () {
            BufferedReader in = new BufferedReader(new FileReader("EndSignatuer.txt"));
            FileInputStream keyfis = new FileInputStream("EndSignatuer.txt");
            byte[] Signen = new byte[keyfis.available()];
            keyfis.read(Signen);
            keyfis.close();
            String signatureString = new String(Signde);
            System.out.println("SignatureString:" + signatureString);
            len = Signde.length;
            X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
            KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
            PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
            Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
            sig.initVerify(pubKey);
    

    }

  6. 我需要:

    public static void verify (byte[] mydata) {
    ........
    sig.initVerify(mydata);
    }
    

1 个答案:

答案 0 :(得分:0)

首先,验证签名不涉及“通过公钥解密”。对于RSA,签名和验证确实使用类似的加密和解密操作,这使许多人混淆了这种方式,但实际上它们是不同的。对于你在这里使用的DSA和ECDSA,差别更大:没有涉及加密或解密的内容,只有签名和验证。

此外,与许多加密对象一样,签名实际上是随机字节,而不是有效字符。转换为String并尝试显示它最多会产生垃圾,并可能弄乱您的显示器。在需要限制为有效字符(如S / MIME和XML)的情况下,通常转换为base64或hex,并在需要时返回二进制。

那就是说,你很亲密。首先,使用publickey调用sig.initVerify。然后使用数据调用 sig.update ,这些数据可以是单个缓冲区或一系列缓冲区(特别是当您有多个数据而不是一次适合内存时)。最后,使用签名值调用 sig.verify ,它将返回true或false。有关详细信息,请参阅http://docs.oracle.com/javase/7/docs/api/java/security/Signature.html