# 验证签名

> 原文： [https://docs.oracle.com/javase/tutorial/security/apisign/vstep4.html](https://docs.oracle.com/javase/tutorial/security/apisign/vstep4.html)

您已将代码添加到`VerSig`程序中

*   输入编码的密钥字节并将其转换为名为`pubKey`的`PublicKey`
*   将签名字节输入到名为`sigToVerify`的字节数组中

您现在可以继续进行验证。

初始化签名对象以进行验证

与签名生成一样，通过使用`Signature`类的实例来验证签名。您需要创建一个`Signature`对象，该对象使用与生成签名时相同的签名算法。 `GenSig`程序使用的算法是 SUN 提供商提供的 SHA1withDSA 算法。

```
Signature sig = Signature.getInstance("SHA1withDSA", "SUN");

```

接下来，您需要初始化`Signature`对象。用于验证的初始化方法需要公钥。

```
sig.initVerify(pubKey);

```

**为要验证的数据提供签名对象**您现在需要为`Signature`对象提供生成签名的数据。此数据位于文件中，其名称已指定为第三个命令行参数。正如您在签名时所做的那样，一次读入一个缓冲区的数据，并通过调用`update`方法将其提供给`Signature`对象。

```
FileInputStream datafis = new FileInputStream(args[2]);
BufferedInputStream bufin = new BufferedInputStream(datafis);

byte[] buffer = new byte[1024];
int len;
while (bufin.available() != 0) {
    len = bufin.read(buffer);
    sig.update(buffer, 0, len);
};

bufin.close();

```

验证签名

将所有数据提供给`Signature`对象后，您可以验证该数据的数字签名并报告结果。回想一下，所谓的签名被读入一个名为`sigToVerify`的字节数组中。

```
boolean verifies = sig.verify(sigToVerify);

System.out.println("signature verifies: " + verifies);

```

如果所谓的签名（`sigToVerify`）是由对应于公钥`pubKey`的私钥生成的指定数据文件的实际签名，则`verifies`值将是`true`。