当前位置: 首页 > 知识库问答 >
问题:

使用公钥/私钥签名进行身份验证:什么是好消息(摘要)?

郝峰
2023-03-14

我正在构建一个具有客户机/服务器基础结构的应用程序,并希望使用公钥/私钥方法实现一个身份验证机制。

让我们假设一个客户机拥有私钥,而服务器只拥有公钥。在身份验证过程中,客户端使用私钥对消息进行签名,并将其发送到服务器,在服务器上使用公钥对消息进行验证。如果验证成功,则对客户端进行身份验证。

下面是一些JUnit测试代码,我在这些代码中熟悉了这些概念:

@Test
public void testSignature() throws Exception {
    final String message = "Hello world is a stupid message to be signed";

    final KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();

    final Signature privSig = Signature.getInstance("SHA1withRSA");

    privSig.initSign(keyPair.getPrivate());
    privSig.update(message.getBytes());

    byte[] signature = privSig.sign();

    final Signature pubSig = Signature.getInstance("SHA1withRSA");

    pubSig.initVerify(keyPair.getPublic());
    pubSig.update(message.getBytes());

    assertTrue(pubSig.verify(signature));
}

共有1个答案

狄元魁
2023-03-14

静态字符串会很糟糕,因为它容易受到重复攻击(带符号的字符串每次都是一样的)。

虽然,你似乎是在推倒重来之前已经做过的事情。使用证书是受信任的方式。有关它的更多信息,请参阅此示例:Java HTTPS客户端证书身份验证

如果您想自己实现它,您可能需要阅读SSL的工作原理并进行模拟。任何其他解决方案都有可能存在一些缺陷,除非它是定制的(例如,您的客户端将保留一个1000个共享静态字符串的列表,但它从未重用过这些字符串,而服务器也有相同的列表,并跟踪使用了哪些字符串。或者,按照下面的注释中的建议,跟踪一个递增的共享数字。)

 类似资料:
  • 我正在尝试使用私钥和公钥对为sftp服务器设置身份验证。 我已经在本地计算机上设置了带有Bitvise SSH服务器的sftp服务器。我用SSH服务器生成了私钥和公钥。我已经在SSH服务器的主机密钥部分上设置了私钥,并且已经创建了一个虚拟帐户并将公钥设置到该帐户。 谢谢

  • 另外,这里还有一个函数演示,它从mod和指数生成PEM(摘自http://stackoverflow.com/questions/18835132/xml-to-pem-in-node-js) 前面提到的jsonwebtoken库可以使用任何一种方法来验证JWT--但是为什么呢?如果这两种验证方法都可以验证一个JWT签名,为什么它们都存在呢?他们之间有什么权衡?一个比另一个更安全吗?我应该使用哪一

  • JSch日志: 的日志:

  • 我正在使用这个库node jwks rsa从auth0 jwks获取JWT密钥。json文件,以验证我的应用程序在身份验证后检索的id_令牌实际上来自我的身份验证提供程序。 在引擎盖下,它使用此方法构建公钥PEM (使用x50c作为. jwks文件中的参数)。 然后,我将其与jsonwebToken结合使用,以验证JWT(id_token)是否有效。 这种验证方法与根据jwks的模和指数生成私钥(

  • 问题内容: 我有一个外部服务,在定义的事件发生后会给我回电,并用其私钥签署他的请求。 我已经存储了如下公钥: 因此,我的工作是通过验证签名来检查请求的内容是否未更改。 这是我的算法: 但是目前,我的算法已停止在此消息的“ PublicKey publicKey = keyFactory.generatePublic(publicKeySpec)”步骤处: 那么,如何以java api接受的方式加载

  • 如何验证公钥与私钥匹配? 在应用程序启动时,从base64 PEM编码字符串加载2048位RSA密钥。我希望在继续之前验证密钥是否有效以及是否匹配。签名和验证由我使用的下划线库完成。 我可以签署和验证虚拟数据,但我正在寻找替代解决方案。 首发操场:https://play.golang.org/p/tsB8Yp-xs47