Java 中文官方教程 2022 版(四十二)(1)

简介: Java 中文官方教程 2022 版(四十二)

设置策略文件以授予所需的权限。

原文:docs.oracle.com/javase/tutorial/security/toolsign/rstep3.html

接下来,您将使用策略工具创建一个名为**exampleraypolicy**的策略文件,并在其中授予来自已签名 JAR 文件的代码权限。

JAR 文件必须使用与上一步中导入到 Ray 的密钥库(exampleraystore)中的公钥对应的私钥进行签名。包含公钥的证书在密钥库中被别名为susan。我们将授予此类代码权限以读取C:\TestData\目录中的任何文件。

步骤如下:

  1. 启动策略工具
  2. 指定密钥库
  3. 使用 SignedBy 别名添加策略条目
  4. 保存策略文件

启动策略工具

原文: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\目录中所有文件的读取访问权限。您需要

  1. 指定包含别名为 susan 的证书信息的密钥库
  2. 创建授予权限的策略条目

密钥库是在将证书导入为受信任的证书步骤中创建的名为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/*

要添加权限,请选择添加权限按钮。这将打开权限对话框。


执行以下操作。

  1. 从权限下拉列表中选择文件权限。完整的权限类型名称(java.io.FilePermission)现在显示在下拉列表右侧的文本框中。
  2. 在标记为目标名称的列表右侧的文本框中键入以下内容,以指定C:\TestData\目录中的所有文件:
C:\TestData\*
  1. 通过从操作下拉列表中选择读取选项来指定读取权限。

现在权限对话框看起来像下面这样。


选择确定按钮。新的权限出现在策略条目对话框中的一行中,如下所示。



注意: 你在文件路径中键入的每个反斜杠都已替换为两个反斜杠,以方便您使用。策略文件中的字符串由一个标记器处理,允许使用 \ 作为转义字符(例如,\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.jarexampleraypolicy文件的目录中键入以下内容:

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 文件中存储数据文件而不是类文件。

作为合同发送方,您需要执行以下步骤。

  1. 创建包含合同的 JAR 文件,使用jar工具。
  2. 生成密钥(如果尚未存在),使用keytool-genkey命令。
    可选步骤:为公钥证书生成证书签名请求(CSR),并导入认证机构的响应。为简单起见,由于您只是假装是 Stan Smith,因此省略了此步骤。有关更多信息,请参见为公钥证书生成证书签名请求(CSR)。
  3. 对 JAR 文件进行签名,使用jarsigner工具和第 2 步生成的私钥。
  4. 导出公钥证书,使用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,执行以下步骤。

  1. 使用keytool-import命令将证书导入为受信任的证书。
  2. 使用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示例程序。

  1. 准备初始程序结构
    创建一个名为GenSig.java的文本文件。输入初始程序结构(导入语句、类名、main方法等)。
  2. 生成公钥和私钥
    生成一对密钥(公钥和私钥)。私钥用于对数据进行签名。公钥将被VerSig程序用于验证签名。
  3. 对数据进行签名
    获取一个Signature对象并初始化以进行签名。提供要签名的数据,并生成签名。
  4. 保存签名和公钥到文件中
    将签名字节保存在一个文件中,将公钥字节保存在另一个文件中。
  5. 编译并运行程序

准备初始程序结构

原文: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包,其中包含输入要签名的文件数据所需的方法。
  • 期望提供一个参数,指定要签名的数据文件。
  • 后续步骤中编写的代码将放在trycatch块之间。

生成公钥和私钥

原文: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 SpecificationJava 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(),因为它获取已知强算法的实例。

生成密钥对

最后一步是生成密钥对,并将密钥存储在PrivateKeyPublicKey对象中。

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 对象用于签名或验证之前,必须进行初始化。签名的初始化方法需要一个私钥。使用前一步中放入名为 privPrivateKey 对象中的私钥。

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

相关文章
|
7月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
360 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
3月前
|
Oracle Java 关系型数据库
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
305 2
|
8月前
|
消息中间件 Java 数据库
自研Java框架 Sunrays-Framework使用教程「博客之星」
### Sunrays-Framework:助力高效开发的Java微服务框架 **Sunrays-Framework** 是一款基于 Spring Boot 构建的高效微服务开发框架,深度融合了 Spring Cloud 生态中的核心技术组件。它旨在简化数据访问、缓存管理、消息队列、文件存储等常见开发任务,帮助开发者快速构建高质量的企业级应用。 #### 核心功能 - **MyBatis-Plus**:简化数据访问层开发,提供强大的 CRUD 操作和分页功能。 - **Redis**:实现高性能缓存和分布式锁,提升系统响应速度。 - **RabbitMQ**:可靠的消息队列支持,适用于异步
自研Java框架 Sunrays-Framework使用教程「博客之星」
|
9月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
8410 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
8月前
|
Java 数据库连接 数据处理
探究Java异常处理【保姆级教程】
Java 异常处理是确保程序稳健运行的关键机制。它通过捕获和处理运行时错误,避免程序崩溃。Java 的异常体系以 `Throwable` 为基础,分为 `Error` 和 `Exception`。前者表示严重错误,后者可细分为受检和非受检异常。常见的异常处理方式包括 `try-catch-finally`、`throws` 和 `throw` 关键字。此外,还可以自定义异常类以满足特定需求。最佳实践包括捕获具体异常、合理使用 `finally` 块和谨慎抛出异常。掌握这些技巧能显著提升程序的健壮性和可靠性。
133 4
|
8月前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
145 1
|
9月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
556 26
|
8月前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
415 0
|
9月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
9月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)

热门文章

最新文章