Module java.base
Package java.security

Class Signature


public abstract class Signature extends SignatureSpi
Signature类用于提供数字签名算法的功能。数字签名用于对数字数据进行身份验证和完整性保证。

签名算法可以是NIST标准DSA,使用DSA和SHA-256等。使用SHA-256消息摘要算法的DSA算法可以指定为SHA256withDSA。在RSA的情况下,签名算法可以指定为,例如,SHA256withRSA。必须指定算法名称,因为没有默认值。

Signature对象可用于生成和验证数字签名。

对于使用Signature对象签署数据或验证签名,有三个阶段:

  1. 初始化,可以是
  2. 更新

    根据初始化的类型,这将更新要签署或验证的字节。参见update方法。

  3. 对所有更新的字节进行签署或验证签名。参见sign方法和verify方法。

请注意,此类是抽象类,并且出于历史原因扩展自SignatureSpi。应用程序开发人员应仅注意Signature类中定义的方法;超类中的所有方法都是为希望提供其自己的数字签名算法实现的加密服务提供者而设计的。

Java平台的每个实现都必须支持以下标准Signature算法:

  • SHA1withDSA
  • SHA256withDSA
  • SHA1withRSA
  • SHA256withRSA
这些算法在Java安全标准算法名称规范的签名部分中有描述。请查阅您的实现的发布文档,以查看是否支持任何其他算法。
自版本:
1.1
  • Field Details

    • UNINITIALIZED

      protected static final int UNINITIALIZED
      可能的state值,表示此Signature对象尚未初始化。
      参见:
    • SIGN

      protected static final int SIGN
      可能的state值,表示此Signature对象已初始化用于签署。
      参见:
    • VERIFY

      protected static final int VERIFY
      可能的state值,表示此Signature对象已初始化用于验证。
      参见:
    • state

      protected int state
      Signature对象的当前状态。
  • Constructor Details

    • Signature

      protected Signature(String algorithm)
      为指定的算法创建一个Signature对象。
      参数:
      algorithm - 算法的标准字符串名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的签名部分。
  • Method Details

    • getInstance

      public static Signature getInstance(String algorithm) throws NoSuchAlgorithmException
      返回实现指定签名算法的Signature对象。

      此方法遍历已注册的安全提供者列表,从最首选的提供者开始。返回封装了支持指定算法的第一个提供者的SignatureSpi实现的新Signature对象。

      请注意,已注册提供者列表可以通过Security.getProviders()方法检索。

      实现注意:
      JDK参考实现还使用jdk.security.provider.preferred Security属性来确定指定算法的首选提供者顺序。这可能与由Security.getProviders()返回的提供者顺序不同。
      参数:
      algorithm - 请求的算法的标准名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的签名部分。
      返回:
      新的Signature对象
      抛出:
      NoSuchAlgorithmException - 如果没有Provider支持指定算法的Signature实现
      NullPointerException - 如果algorithmnull
      参见:
    • getInstance

      public static Signature getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
      返回实现指定签名算法的Signature对象。

      返回封装了指定提供者的SignatureSpi实现的新Signature对象。指定的提供者必须在安全提供者列表中注册。

      请注意,已注册提供者列表可以通过Security.getProviders()方法检索。

      参数:
      algorithm - 请求的算法的名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的签名部分。
      provider - 提供者的名称。
      返回:
      新的Signature对象
      抛出:
      IllegalArgumentException - 如果提供者名称为null或空
      NoSuchAlgorithmException - 如果指定提供者不提供指定算法的SignatureSpi实现
      NoSuchProviderException - 如果指定提供者未在安全提供者列表中注册
      NullPointerException - 如果algorithmnull
      参见:
    • getInstance

      public static Signature getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException
      返回实现指定签名算法的Signature对象。

      返回一个新的Signature对象,封装了来自指定提供程序的SignatureSpi实现。请注意,指定的提供程序不必在提供程序列表中注册。

      参数:
      algorithm - 请求的算法名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的Signature部分。
      provider - 提供程序。
      返回:
      新的Signature对象
      抛出:
      IllegalArgumentException - 如果提供程序为null
      NoSuchAlgorithmException - 如果指定算法的SignatureSpi实现不可从指定的Provider对象获取
      NullPointerException - 如果algorithmnull
      自从:
      1.4
      另请参见:
    • getProvider

      public final Provider getProvider()
      返回此Signature对象的提供程序。
      返回:
      Signature对象的提供程序
    • initVerify

      public final void initVerify(PublicKey publicKey) throws InvalidKeyException
      为验证初始化此对象。如果再次使用不同参数调用此方法,则会取消此调用的效果。
      参数:
      publicKey - 要验证签名的身份的公钥。
      抛出:
      InvalidKeyException - 如果密钥无效。
    • initVerify

      public final void initVerify(Certificate certificate) throws InvalidKeyException
      使用给定证书的公钥初始化此对象以进行验证。

      如果证书是X.509类型并且具有标记为关键的密钥用途扩展字段,并且密钥用途扩展字段的值暗示证书中的公钥及其对应的私钥不应用于数字签名,则会抛出InvalidKeyException

      参数:
      certificate - 要验证签名的身份的证书。
      抛出:
      InvalidKeyException - 如果证书中的公钥未正确编码或不包含所需的参数信息或无法用于数字签名目的。
      自从:
      1.3
    • initSign

      public final void initSign(PrivateKey privateKey) throws InvalidKeyException
      为签名初始化此对象。如果再次使用不同参数调用此方法,则会取消此调用的效果。
      参数:
      privateKey - 要生成签名的身份的私钥。
      抛出:
      InvalidKeyException - 如果密钥无效。
    • initSign

      public final void initSign(PrivateKey privateKey, SecureRandom random) throws InvalidKeyException
      为签名初始化此对象。如果再次使用不同参数调用此方法,则会取消此调用的效果。
      参数:
      privateKey - 要生成签名的身份的私钥
      random - 用于此Signature对象的随机源
      抛出:
      InvalidKeyException - 如果密钥无效。
    • sign

      public final byte[] sign() throws SignatureException
      返回更新的所有数据的签名字节。签名的格式取决于底层签名方案。

      调用此方法会将此Signature对象重置为之前通过调用initSign(PrivateKey)进行签名初始化时的状态。也就是说,对象被重置并可用于从相同签名者生成另一个签名,如果需要的话,可以通过对updatesign进行新调用。

      返回:
      签名操作结果的签名字节。
      抛出:
      SignatureException - 如果此Signature对象未正确初始化,或者此签名算法无法处理提供的输入数据。
    • sign

      public final int sign(byte[] outbuf, int offset, int len) throws SignatureException
      完成签名操作,并将生成的签名字节存储在提供的缓冲区outbuf中,从offset开始。签名的格式取决于底层签名方案。

      Signature对象将重置为其初始状态(即在调用initSign方法之一后的状态),并可重用以使用相同私钥生成进一步的签名。

      参数:
      outbuf - 用于签名结果的缓冲区。
      offset - 存储签名的outbuf中的偏移量。
      len - 用于签名的outbuf中的字节数。
      返回:
      放入outbuf的字节数。
      抛出:
      SignatureException - 如果此Signature对象未正确初始化,此签名算法无法处理提供的输入数据,或者len小于实际签名长度。
      IllegalArgumentException - 如果outbufnull,或者offsetlen小于0,或者offsetlen的总和大于outbuf的长度。
      自从:
      1.2
    • verify

      public final boolean verify(byte[] signature) throws SignatureException
      验证传入的签名。

      调用此方法会将此Signature对象重置为之前通过调用initVerify(PublicKey)进行验证初始化时的状态。也就是说,对象被重置并可用于验证另一个由在调用initVerify中指定公钥的身份生成的签名。

      参数:
      signature - 要验证的签名字节。
      返回:
      如果签名已验证,则为true,如果未验证,则为false
      抛出:
      SignatureException - 如果此Signature对象未正确初始化,传入的签名编码不正确或类型错误,此签名算法无法处理提供的输入数据等。
    • verify

      public final boolean verify(byte[] signature, int offset, int length) throws SignatureException
      在指定的字节数组中从指定偏移量开始验证传入的签名。

      调用此方法会将此Signature对象重置为之前通过调用initVerify(PublicKey)进行验证初始化时的状态。也就是说,对象被重置并可用于验证另一个由在调用initVerify中指定公钥的身份生成的签名。

      参数:
      signature - 要验证的签名字节。
      offset - 要从字节数组中开始的偏移量。
      length - 要使用的字节数,从偏移量开始。
      返回:
      如果签名已验证,则为true,如果未验证,则为false
      抛出:
      SignatureException - 如果此Signature对象未正确初始化,传入的签名编码不正确或类型错误,此签名算法无法处理提供的输入数据等。
      IllegalArgumentException - 如果signature字节数组为null,或者offsetlength小于0,或者offsetlength的总和大于signature字节数组的长度。
      自从:
      1.4
    • update

      public final void update(byte b) throws SignatureException
      通过一个字节更新要签名或验证的数据。
      参数:
      b - 用于更新的字节。
      抛出:
      SignatureException - 如果此Signature对象未正确初始化。
    • update

      public final void update(byte[] data) throws SignatureException
      使用指定的字节数组更新要签名或验证的数据。
      参数:
      data - 用于更新的字节数组。
      抛出:
      SignatureException - 如果此Signature对象未正确初始化。
    • update

      public final void update(byte[] data, int off, int len) throws SignatureException
      使用指定的字节数组从指定偏移量开始更新要签名或验证的数据。
      参数:
      data - 字节数组。
      off - 要从字节数组中开始的偏移量。
      len - 要使用的字节数,从偏移量开始。
      抛出:
      SignatureException - 如果此Signature对象未正确初始化。
      IllegalArgumentException - 如果datanull,或者offlen小于0,或者offlen的总和大于data的长度。
    • update

      public final void update(ByteBuffer data) throws SignatureException
      使用指定的ByteBuffer更新要签名或验证的数据。处理从data.position()开始的data.remaining()字节。返回时,缓冲区的位置将等于其限制;其限制不会改变。
      参数:
      data - ByteBuffer
      抛出:
      SignatureException - 如果此Signature对象未正确初始化。
      自版本:
      1.5
    • getAlgorithm

      public final String getAlgorithm()
      返回此Signature对象的算法名称。
      返回:
      Signature对象的算法名称。
    • toString

      public String toString()
      返回此Signature对象的字符串表示形式,提供包括对象状态和所使用算法名称在内的信息。
      覆盖:
      toString 在类 Object
      返回:
      Signature对象的字符串表示形式。
    • setParameter

      @Deprecated public final void setParameter(String param, Object value) throws InvalidParameterException
      Deprecated.
      将指定算法参数设置为指定值。此方法提供了一种通用机制,通过该机制可以设置此对象的各种参数。参数可以是算法的任何可设置参数,例如参数大小,用于签名生成的随机位源(如果适用),或指示是否执行特定但可选计算的指示。对于每个参数,希望有一个统一的算法特定命名方案,但目前未指定。
      参数:
      param - 参数的字符串标识符
      value - 参数值
      抛出:
      InvalidParameterException - 如果param是此Signature对象的无效参数,参数已设置且无法再次设置,发生安全异常等。
      参见:
    • setParameter

      public final void setParameter(AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException
      使用指定的参数值初始化此Signature对象。
      参数:
      params - 参数值
      抛出:
      InvalidAlgorithmParameterException - 如果给定的参数值不适用于此Signature对象
      参见:
    • getParameters

      public final AlgorithmParameters getParameters()
      返回与此Signature对象一起使用的参数。

      返回的参数可能与用于初始化此Signature对象的参数相同,也可能包含底层签名方案使用的默认或随机参数值。如果未提供所需参数并且可以由Signature对象生成,则返回生成的参数;否则返回null

      但是,如果签名方案不支持将参数作为AlgorithmParameters返回,则始终返回null

      返回:
      与此Signature对象一起使用的参数,或null
      抛出:
      UnsupportedOperationException - 如果提供程序不支持此方法
      自版本:
      1.4
      参见:
    • getParameter

      @Deprecated public final Object getParameter(String param) throws InvalidParameterException
      Deprecated.
      获取指定算法参数的值。此方法提供了一种通用机制,通过该机制可以获取此对象的各种参数。参数可以是算法的任何可设置参数,例如参数大小,用于签名生成的随机位源(如果适用),或指示是否执行特定但可选计算的指示。对于每个参数,希望有一个统一的算法特定命名方案,但目前未指定。
      参数:
      param - 参数的字符串名称。
      返回:
      表示参数值的对象,如果没有则返回null
      抛出:
      InvalidParameterException - 如果此引擎的参数是无效参数,或在尝试获取此参数时发生其他异常。
      参见:
    • clone

      public Object clone() throws CloneNotSupportedException
      如果实现支持克隆,则返回克隆。
      覆盖:
      clone 在类 SignatureSpi
      返回:
      如果实现支持克隆,则返回克隆。
      抛出:
      CloneNotSupportedException - 如果在不支持Cloneable的实现上调用此方法。
      参见: