设置策略文件以授予所需的权限。
原文:
docs.oracle.com/javase/tutorial/security/toolsign/rstep3.html
接下来,您将使用策略工具创建一个名为**exampleraypolicy
**的策略文件,并在其中授予来自已签名 JAR 文件的代码权限。
JAR 文件必须使用与上一步中导入到 Ray 的密钥库(exampleraystore
)中的公钥对应的私钥进行签名。包含公钥的证书在密钥库中被别名为susan
。我们将授予此类代码权限以读取C:\TestData\
目录中的任何文件。
步骤如下:
- 启动策略工具
- 指定密钥库
- 使用 SignedBy 别名添加策略条目
- 保存策略文件
启动策略工具
原文:
docs.oracle.com/javase/tutorial/security/toolsign/wstep1.html
要启动策略工具,只需在命令行中键入以下内容:
policytool
这将打开策略工具窗口。每次启动策略工具时,它会尝试从通常称为“用户策略文件”的文件中填充此窗口中的策略信息,默认情况下,该文件名为.java.policy
,位于您的主目录中。如果策略工具找不到用户策略文件,它会报告这种情况并显示一个空白的策略工具窗口(即,一个带有标题和按钮但没有数据的窗口,如下图所示。
由于本教程的课程不需要对您的官方用户策略文件进行修改,因此您将创建并使用一个与用户策略文件不同的策略文件。
假设您看到了空白的策略工具窗口(如果没有,请在文件菜单中选择新建),您可以立即开始创建一个新的策略文件。
指定密钥库
原文:
docs.oracle.com/javase/tutorial/security/toolsign/wstep2.html
对于本课程,您将授予别名为 susan 的 JAR 文件中的所有代码对C:\TestData\
目录中所有文件的读取访问权限。您需要
- 指定包含别名为 susan 的证书信息的密钥库
- 创建授予权限的策略条目
密钥库是在将证书导入为受信任的证书步骤中创建的名为exampleraystore
的密钥库。
要指定密钥库,请在主策略工具窗口的编辑菜单中选择更改密钥库命令。这将弹出一个对话框,您可以在其中指定密钥库 URL 和密钥库类型。
要指定名为exampleraystore
的密钥库,位于C:
驱动器上的Test
目录中,请在标记为“New KeyStore URL”的文本框中键入以下file
URL
file:/C:/Test/exampleraystore
如果密钥库类型是默认类型,可以将标记为“New KeyStore Type”的文本框留空,如安全属性文件中所指定的那样。您的密钥库将是默认类型,因此请将文本框留空。
注意: “New KeyStore URL”值是一个 URL,因此应始终使用斜杠(而不是反斜杠)作为目录分隔符。
当您完成指定密钥库 URL 后,请选择确定。标记为密钥库的文本框现在填入了 URL。
接下来,您需要指定新的策略条目。
添加带有 SignedBy 别名的策略条目
原文:
docs.oracle.com/javase/tutorial/security/toolsign/wstep3.html
要授予由susan
签名的代码权限以读取C:\TestData
目录中的任何文件,您需要创建一个授予此权限的策略条目。请注意,“由susan
签名的代码”是指“包含在 JAR 文件中的类文件中的代码,其中 JAR 文件是使用与出现在别名为susan
的 keystore 证书中的公钥对应的私钥签名的。”
在主策略工具窗口中选择添加策略条目按钮。这将打开策略条目对话框:
在此对话框中,将以下别名键入到SignedBy文本框中:
susan
将CodeBase文本框留空,以授予由susan
签名的所有代码权限,无论其来源。
注意: 如果您想将权限限制为仅来自C:\Test\
目录的susan
签名代码,您将在CodeBase文本框中键入以下 URL:
file:/C:/Test/*
要添加权限,请选择添加权限按钮。这将打开权限对话框。
执行以下操作。
- 从权限下拉列表中选择文件权限。完整的权限类型名称(
java.io.FilePermission
)现在显示在下拉列表右侧的文本框中。 - 在标记为目标名称的列表右侧的文本框中键入以下内容,以指定
C:\TestData\
目录中的所有文件:
C:\TestData\*
- 通过从操作下拉列表中选择读取选项来指定读取权限。
现在权限对话框看起来像下面这样。
选择确定按钮。新的权限出现在策略条目对话框中的一行中,如下所示。
注意: 你在文件路径中键入的每个反斜杠都已替换为两个反斜杠,以方便您使用。策略文件中的字符串由一个标记器处理,允许使用 \ 作为转义字符(例如,\n
表示换行),因此策略文件需要两个反斜杠来表示一个反斜杠。如果您使用单个反斜杠作为目录分隔符,策略工具会自动将其转换为双反斜杠。
现在已经完成指定此策略条目的操作,请在策略条目对话框中选择完成按钮。策略工具窗口现在包含表示策略条目的一行,显示SignedBy值。
保存策略文件
原文:
docs.oracle.com/javase/tutorial/security/toolsign/wstep4.html
要保存你正在创建的新策略文件,请从文件菜单中选择另存为命令。这将弹出另存为对话框。
浏览目录结构,找到要保存策略文件的目录:C:
驱动器上的Test
目录。输入文件名。
exampleraypolicy
然后选择保存按钮。策略文件现在已保存,其名称和路径显示在标有策略文件的文本框中。
然后通过从文件菜单中选择退出命令退出策略工具。
查看策略文件效果
原文:
docs.oracle.com/javase/tutorial/security/toolsign/rstep4.html
在之前的步骤中,你在exampleraypolicy
策略文件中创建了一个条目,授予由susan
签名的代码从C:\TestData\
目录(或者如果你在 UNIX 上工作,则是你的主目录中的testdata
目录)读取文件的权限。现在,你应该能够成功地执行Count
程序,从指定目录中读取文件并计算字符数,即使在使用安全管理器运行应用程序时也是如此。
如在创建策略文件课程的结尾所述,有两种可能的方式可以使exampleraypolicy
文件作为整体策略的一部分被考虑,除了在安全属性文件中指定的策略文件之外。第一种方法是在传递给运行时系统的属性中指定额外的策略文件。第二种方法是在安全属性文件中添加一行指定额外的策略文件。
方法 1
你可以使用-Djava.security.policy
命令行参数来指定一个策略文件,该文件应该被用来补充或替代安全属性文件中指定的文件。
要运行Count
应用程序并包含exampleraypolicy
策略文件,请在包含sCount.jar
和exampleraypolicy
文件的目录中键入以下内容:
java -Djava.security.manager -Djava.security.policy=exampleraypolicy -cp sCount.jar Count C:\TestData\data
注意:在一行上键入命令,-D
和-cp
之前加上一个空格。
程序应该报告指定文件中的字符数。
如果仍然报错,那么策略文件中可能存在问题。使用策略工具检查你在上一步中创建的权限,并更正任何拼写错误或其他错误。
方法 2
你可以在安全属性文件中的policy.url.n
属性中指定多个 URL,包括形如"http://"的 URL,所有指定的策略文件都将被加载。
因此,让解释器考虑你的exampleraypolicy
文件的策略条目的一种方法是在安全属性文件中添加指示该文件的条目。
**重要提示:**如果你正在运行自己的 JDK 副本,你可以轻松编辑你的安全属性文件。如果你正在运行与他人共享的版本,只有在你有写入权限或在适当时向系统管理员请求修改文件时,你才能修改系统范围的安全属性文件。然而,在本教程测试中,对于你来说可能不适合修改系统范围的策略文件;我们建议你只是阅读以下内容以了解如何操作,或者安装你自己的私人版本的 JDK 以供教程课程使用。
安全属性文件位于
- Windows:
*java.home*\lib\security\java.security
- UNIX:
*java.home*/lib/security/java.security
*java.home
*部分表示 JRE 安装的目录。
要修改安全属性文件,请在适合编辑 ASCII 文本文件的编辑器中打开它。然后在以policy.url.2
开头的行后添加以下行:
- Windows:
**policy.url.3=file:/C:/Test/exampleraypolicy**
- UNIX:
**policy.url.3=file:${user.home}/test/exampleraypolicy**
在 UNIX 系统上,您还可以显式指定您的主目录,如
policy.url.3=file:/home/susanj/test/exampleraypolicy
接下来,在您的命令窗口中,转到包含sCount.jar
文件的目录,即C:\Test
或~/test
目录。在一行上键入以下命令:
java -Djava.security.manager -cp sCount.jar Count C:\TestData\data
与第一种方法一样,如果程序仍然报告错误,则可能是策略文件出现问题。使用策略工具检查您在上一步中创建的权限,并更正任何拼写错误或其他错误。
**重要提示:**在继续之前,您可能希望删除您刚刚在安全属性文件中添加的行(或将其注释掉),因为您可能不希望在不运行教程课程时包含exampleraypolicy
文件。
课程:文件交换
原文:
docs.oracle.com/javase/tutorial/security/toolfilex/index.html
如果您想将重要文件(如合同)电子发送给他人,最好对文件进行数字“签名”,以便您的接收方可以检查文件确实来自您,并在传输过程中未被更改。
本课程向您展示如何使用安全工具交换重要文件,本例中为合同。
首先,您假装自己是合同发送方,斯坦·史密斯。本课程展示了斯坦将使用的步骤,将合同放入 JAR 文件中,签名并导出与用于签署 JAR 文件的私钥对应的公钥证书。
然后,你假装自己是鲁思,已经收到签名的 JAR 文件和证书。你将使用keytool
将证书导入鲁思的密钥库中,别名为stan
,并使用jarsigner
工具验证签名。
有关数字签名、证书、密钥库和工具的更多信息,请参阅用于安全代码和文件交换的 API 和工具使用课程。
**注意:**本课程假设您从同一目录中执行所有命令。
以下是步骤:
- 发送方操作步骤
- 接收方操作步骤
合同发送方的步骤
原文:
docs.oracle.com/javase/tutorial/security/toolfilex/sender.html
此处为合同发送方概述的步骤与签署代码并授予权限课程中列出的代码签署者的步骤基本相同。然而,在这里,您假装是 Stan Smith 而不是 Susan Jones,并且在要签名的 JAR 文件中存储数据文件而不是类文件。
作为合同发送方,您需要执行以下步骤。
- 创建包含合同的 JAR 文件,使用
jar
工具。 - 生成密钥(如果尚未存在),使用
keytool
的-genkey
命令。
可选步骤:为公钥证书生成证书签名请求(CSR),并导入认证机构的响应。为简单起见,由于您只是假装是 Stan Smith,因此省略了此步骤。有关更多信息,请参见为公钥证书生成证书签名请求(CSR)。 - 对 JAR 文件进行签名,使用
jarsigner
工具和第 2 步生成的私钥。 - 导出公钥证书,使用
keytool
的-export
命令。然后将签名的 JAR 文件和证书提供给接收方 Ruth。
创建包含合同的 JAR 文件
原文:
docs.oracle.com/javase/tutorial/security/toolfilex/step1.html
你需要的第一件事是一个合同文件。你可以下载并使用这个非常基本的示例文件,命名为contract
。或者你也可以使用其他任何你喜欢的文件。只需确保将文件命名为contract
,这样它就可以与本课程中指定的命令一起使用。
一旦你有了合同文件,将其放入一个 JAR 文件中。在你的命令窗口中输入以下内容:
jar cvf Contract.jar contract
这个命令创建一个名为Contract.jar
的 JAR 文件,并将contract
文件放入其中。
生成密钥
原文:
docs.oracle.com/javase/tutorial/security/toolfilex/step2.html
在签署包含contract
文件的Contract.jar
JAR 文件之前,如果您尚未拥有合适的密钥,则需要生成密钥。您需要使用私钥对 JAR 文件进行签名,您的接收方需要您相应的公钥来验证您的签名。
本课程假设您尚未拥有密钥对。您将创建一个名为examplestanstore
的密钥库,并创建一个具有新生成的公钥/私钥对的条目(其中公钥在证书中)。
现在假设你是 Stan Smith,并且在 Example2 公司的法律部门工作。在命令窗口中输入以下内容,创建一个名为examplestanstore
的密钥库,并为 Stan Smith 生成密钥:
keytool -genkey -alias signLegal -keystore examplestanstore
密钥库工具会提示您输入密钥库密码、专有名称信息和密钥密码。以下是提示信息;粗体表示您应该输入的内容。
Enter keystore password: *<password>* What is your first and last name? [Unknown]: Stan Smith What is the name of your organizational unit? [Unknown]: Legal What is the name of your organization? [Unknown]: Example2 What is the name of your City or Locality? [Unknown]: New York What is the name of your State or Province? [Unknown]: NY What is the two-letter country code for this unit? [Unknown]: US Is <CN=Stan Smith, OU=Legal, O=Example2, L=New York, ST=NY, C=US> correct? [no]: y Enter key password for <signLegal> (RETURN if same as keystore password):
前面的keytool
命令在执行命令的同一目录中(假设指定的密钥库尚不存在)创建名为examplestanstore
的密钥库,并为具有Stan Smith通用名称和Legal组织单位的实体生成公钥/私钥对。
你刚刚创建的自签名证书包括公钥和专有名称信息。(自签名证书是由与证书中公钥对应的私钥签名的证书。)该证书有效期为 90 天。如果不指定* -validity*选项,则默认有效期为 90 天。该证书与别名为signLegal
的密钥库条目中的私钥相关联。私钥分配了输入的密码。
自签名证书对于开发和测试应用程序非常有用。但是,用户会收到警告,应用程序是使用不受信任的证书签名的,并询问他们是否要运行该应用程序。为了让用户更有信心运行您的应用程序,请使用由认可的证书颁发机构颁发的证书。
签署 JAR 文件
原文:
docs.oracle.com/javase/tutorial/security/toolfilex/step3.html
现在,您已经准备好签署 JAR 文件了。
在命令窗口中一行输入以下内容,以使用密钥库条目中别名为signLegal
的私钥签署 JAR 文件Contract.jar
,并将生成的签名附加到命名为sContract.jar
的结果签名的 JAR 文件中:
jarsigner -keystore examplestanstore -signedjar sContract.jar Contract.jar signLegal
系统会提示您输入存储密码和私钥密码。
jarsigner
工具从别名为signLegal
的密钥库条目中提取证书,并将其附加到已签名 JAR 文件的生成签名中。
导出公钥证书
原文:
docs.oracle.com/javase/tutorial/security/toolfilex/step4.html
您现在拥有一个已签名的 JAR 文件sContract.jar
。想要使用此文件的接收方也希望验证您的签名。为此,他们需要与您用于生成签名的私钥对应的公钥。您可以通过将包含您的公钥的证书副本发送给他们来提供您的公钥。通过以下方式,将该证书从密钥库examplestanstore
复制到名为StanSmith.cer
的文件中:
keytool -export -keystore examplestanstore -alias signLegal -file StanSmith.cer
系统会提示您输入存储密码。
一旦他们获得了该证书和签名的 JAR 文件,您的接收方可以使用jarsigner
工具来验证您的签名。请参阅合同接收方的步骤。
合同接收方的步骤
docs.oracle.com/javase/tutorial/security/toolfilex/receiver.html
现在扮演接收来自 Stan 的签名 JAR 文件和证书文件的 Ruth,执行以下步骤。
- 使用
keytool
的-import
命令将证书导入为受信任的证书。 - 使用
jarsigner
工具验证 JAR 文件签名。
将证书导入为受信任的证书
原文:
docs.oracle.com/javase/tutorial/security/toolfilex/rstep1.html
假设您是 Ruth,并已从 Stan Smith 那里收到
- 签名的 JAR 文件
sContract.jar
包含一个合同 - 文件
StanSmith.cer
包含与用于签署 JAR 文件的私钥对应的公钥证书
在您可以使用jarsigner
工具检查 JAR 文件签名的真实性之前,您需要将 Stan 的证书导入您的密钥库。
即使您(扮演 Stan)创建了这些文件,它们实际上还没有被传输到任何地方,您可以模拟成除创建者和发送者 Stan 之外的其他人。作为 Ruth,输入以下命令创建一个名为exampleruthstore
的密钥库,并将证书导入到别名为stan
的条目中。
keytool -import -alias stan -file StanSmith.cer -keystore exampleruthstore
由于密钥库尚不存在,keytool
将为您创建它。它会提示您输入密钥库密码。
keytool
打印证书信息并要求您验证它;例如,通过将显示的证书指纹与从另一个(受信任的)信息源获得的指纹进行比较。(每个指纹是一个相对较短的数字,可以唯一且可靠地识别证书。)例如,在现实世界中,您可以打电话给 Stan 并询问他应该是什么指纹。他可以通过执行命令获取他创建的StanSmith.cer
文件的指纹
keytool -printcert -file StanSmith.cer
如果他看到的指纹与keytool
向您报告的指纹相同,则您都可以假定证书在传输过程中未被修改。您可以放心地让keytool
继续将一个“受信任的证书”条目放入您的密钥库中。该条目包含来自文件StanSmith.cer
的公钥证书数据。keytool
为这个新条目分配别名stan
。
验证 JAR 文件签名。
docs.oracle.com/javase/tutorial/security/toolfilex/rstep2.html
作为 Ruth,您现在已将 Stan 的公钥证书导入到exampleruthstore
密钥库中作为“受信任的证书”。您现在可以使用jarsigner
工具来验证 JAR 文件签名的真实性。
当您验证已签名的 JAR 文件时,您验证签名是否有效,以及 JAR 文件是否未被篡改。您可以通过以下命令对sContract.jar
文件进行此操作:
jarsigner -verify -verbose -keystore exampleruthstore sContract.jar
您应该看到类似以下内容:
183 Fri Jul 31 10:49:54 PDT 1998 META-INF/SIGNLEGAL.SF 1542 Fri Jul 31 10:49:54 PDT 1998 META-INF/SIGNLEGAL.DSA 0 Fri Jul 31 10:49:18 PDT 1998 META-INF/ smk 1147 Wed Jul 29 16:06:12 PDT 1998 contract s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore i = at least one certificate was found in identity scope jar verified.
请务必使用-verbose
选项运行命令,以获取足够的信息以确保以下内容:
- 合同文件是 JAR 文件中的文件之一,已签名并验证其签名(这就是
s
的意思)。 - 用于验证签名的公钥位于指定的密钥库中,因此您信任它(这就是
k
的意思)。
课程:生成和验证签名
原文:
docs.oracle.com/javase/tutorial/security/apisign/index.html
本课程将指导您使用 JDK 安全 API 为数据生成数字签名并验证签名的步骤。本课程适用于希望将安全功能纳入其程序中的开发人员,包括密码服务。
本课程演示了使用 JDK 安全 API 签署文档。该课程展示了一个程序,由拥有原始文档的人执行,用于生成密钥、使用私钥为文档生成数字签名,并将公钥和签名导出到文件。
然后展示了另一个程序的示例,由文档、签名和公钥的接收者执行。展示了程序如何导入公钥并验证签名的真实性。该课程还讨论并演示了可能的替代方法和提供和导入密钥的方法,包括在证书中。
欲了解有关概念和术语(数字签名、证书、密钥库)的更多信息,请参阅用于安全代码和文件交换的 API 和工具使用课程。
在本课程中,您将创建两个基本应用程序,一个用于数字签名生成,另一个用于验证。接着讨论和演示了潜在的增强功能。本课程包含三个部分。
- 生成数字签名展示了使用 API 生成数据的密钥和数字签名,使用私钥并将公钥和签名导出到文件。应用程序从命令行获取数据文件名。
- 验证数字签名展示了使用 API 导入一个公钥和一个据称是指定数据文件签名的签名,并验证签名的真实性。数据、公钥和签名文件名在命令行中指定。
- 弱点和替代方案讨论了基本程序使用的方法可能存在的弱点。然后介绍并演示了可能的替代方法和提供和导入密钥的方法,包括使用包含编码密钥字节的文件和使用包含公钥的证书。
生成数字签名
原文:
docs.oracle.com/javase/tutorial/security/apisign/gensig.html
即将创建的GenSig
程序将使用 JDK 安全 API 生成密钥和使用私钥为数据生成数字签名,并将公钥和签名导出到文件中。应用程序从命令行获取数据文件名。
以下步骤创建GenSig
示例程序。
- 准备初始程序结构
创建一个名为GenSig.java
的文本文件。输入初始程序结构(导入语句、类名、main
方法等)。 - 生成公钥和私钥
生成一对密钥(公钥和私钥)。私钥用于对数据进行签名。公钥将被VerSig
程序用于验证签名。 - 对数据进行签名
获取一个Signature
对象并初始化以进行签名。提供要签名的数据,并生成签名。 - 保存签名和公钥到文件中
将签名字节保存在一个文件中,将公钥字节保存在另一个文件中。 - 编译并运行程序
准备初始程序结构
原文:
docs.oracle.com/javase/tutorial/security/apisign/step1.html
这是GenSig
程序的基本结构。将其放在名为GenSig.java
的文件中。
import java.io.*; import java.security.*; class GenSig { public static void main(String[] args) { /* Generate a DSA signature */ if (args.length != 1) { System.out.println("Usage: GenSig nameOfFileToSign"); } else try { // the rest of the code goes here } catch (Exception e) { System.err.println("Caught exception " + e.toString()); } } }
注意:
- 签署数据的方法位于
java.security
包中,因此程序从该包中导入所有内容。程序还导入了java.io
包,其中包含输入要签名的文件数据所需的方法。 - 期望提供一个参数,指定要签名的数据文件。
- 后续步骤中编写的代码将放在
try
和catch
块之间。
生成公钥和私钥
原文:
docs.oracle.com/javase/tutorial/security/apisign/step2.html
要能够创建数字签名,您需要一个私钥。(为了验证签名的真实性,还需要相应的公钥。)
在某些情况下,密钥对(私钥和相应的公钥)已经存在于文件中。在这种情况下,程序可以导入并使用私钥进行签名,如 Weaknesses and Alternatives 中所示。
在其他情况下,程序需要生成密钥对。通过使用KeyPairGenerator
类生成密钥对。
在此示例中,您将为数字签名算法(DSA)生成公钥/私钥对。您将生成长度为 1024 位的密钥。
生成密钥对需要几个步骤:
创建密钥对生成器
第一步是获取用于生成 DSA 签名算法密钥的密钥对生成器对象。
与所有引擎类一样,获取特定类型算法的KeyPairGenerator
对象的方法是在KeyPairGenerator
类上调用getInstance
静态工厂方法。该方法有两种形式,都有一个String algorithm
作为第一个参数;其中一种形式还有一个String provider
作为第二个参数。
调用者可以选择指定提供程序的名称,这将确保所请求的算法实现来自指定的提供程序。本课程的示例代码始终指定内置于 JDK 中的默认 SUN 提供程序。
在上述声明之后放置
else try {
在上一步创建的文件中的行,Prepare Initial Program Structure:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
初始化密钥对生成器
下一步是初始化密钥对生成器。所有密钥对生成器都共享密钥大小和随机源的概念。KeyPairGenerator
类有一个initialize
方法,接受这两种类型的参数。
DSA 密钥生成器的密钥大小是密钥长度(以位为单位),您将设置为 1024。
随机源必须是SecureRandom
类的实例,提供一个密码学强随机数生成器(RNG)。有关SecureRandom
的更多信息,请参阅SecureRandom API Specification和Java Cryptography Architecture Reference Guide。
以下示例请求一个使用内置 SUN 提供程序提供的 SHA1PRNG 算法的SecureRandom
实例。然后将此SecureRandom
实例传递给密钥对生成器初始化方法。
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); keyGen.initialize(1024, random);
有些情况需要强随机值,比如创建高价值和长期存在的秘密,如 RSA 公钥和私钥。为了帮助应用程序选择合适的强SecureRandom
实现,从 JDK 8 开始,Java 发行版在java.security.Security
类的securerandom.strongAlgorithms
属性中包含了已知的强SecureRandom
实现列表。当您创建这样的数据时,应考虑使用SecureRandom.getInstanceStrong()
,因为它获取已知强算法的实例。
生成密钥对
最后一步是生成密钥对,并将密钥存储在PrivateKey
和PublicKey
对象中。
KeyPair pair = keyGen.generateKeyPair(); PrivateKey priv = pair.getPrivate(); PublicKey pub = pair.getPublic();
对数据进行签名
原文:
docs.oracle.com/javase/tutorial/security/apisign/step3.html
现在您已经创建了公钥和私钥,可以准备对数据进行签名。在此示例中,您将对文件中包含的数据进行签名。GenSig
从命令行获取文件名。使用 Signature
类的实例创建数字签名。
对数据进行签名,生成该数据的数字签名,需要执行以下步骤。
获取签名对象:以下获取一个 Signature
对象,用于使用 DSA 算法生成或验证签名,该算法与程序在上一步中生成密钥的算法相同,生成公钥和私钥。
Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
注意:在指定签名算法名称时,还应包括签名算法使用的消息摘要算法的名称。SHA1withDSA 是指定 DSA 签名算法的一种方式,使用 SHA-1 消息摘要算法。
初始化签名对象
在 Signature
对象用于签名或验证之前,必须进行初始化。签名的初始化方法需要一个私钥。使用前一步中放入名为 priv
的 PrivateKey
对象中的私钥。
dsa.initSign(priv);
向签名对象提供要签名的数据 该程序将使用作为第一个(也是唯一的)命令行参数指定的文件名中的数据。程序将逐个缓冲区读取数据,并通过调用 update
方法将其提供给 Signature
对象。
FileInputStream fis = new FileInputStream(args[0]); BufferedInputStream bufin = new BufferedInputStream(fis); byte[] buffer = new byte[1024]; int len; while ((len = bufin.read(buffer)) >= 0) { dsa.update(buffer, 0, len); }; bufin.close();
生成签名
一旦所有数据都已提供给 Signature
对象,就可以生成该数据的数字签名。
byte[] realSig = dsa.sign();
Java 中文官方教程 2022 版(四十二)(2)https://developer.aliyun.com/article/1488229