我正在构建一个客户端/服务器基础结构的应用程序,并希望使用公钥/私钥方法实现验证机制。使用公钥/私钥签名进行身份验证:什么是好消息(摘要)?
我们假设客户端拥有私钥并且服务器只有公钥。在认证期间,客户端用私钥签名消息,将其发送到使用公钥验证的服务器。如果验证成功,则客户端通过身份验证。
下面是一些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));
}
当然,为了这个工作服务器和客户端必须持有平原消息(摘要)中。
现在我的问题是:什么是用于签名的好消息(摘要)?例如,这可能是一个静态的硬编码字符串(用于所有客户端),还是会对此概念施加某种安全问题?如果静态字符串不好,在认证之前协商一些随机字符串会是一个好主意吗?这个随机字符串可以用作例如“会话”键,并在一段时间后失效。
是否有原因让您不想使用客户端证书进行标准的SSL/TLS握手? – stinkymatt 2012-04-23 21:26:44
没理由。我正在评估不同的选项。不过,我也想使用私钥进行加密。具有相同密钥(相同用户)的客户端应该能够发送/接收加密消息,而服务器不能解码它们。 – 2012-04-23 21:44:53
如果您不介意拉入厨房水槽,您可以尝试使用支持中介(例如您的服务器似乎是)的SOAP,并允许进行消息级别的身份验证和加密。 http://www.ibm.com/developerworks/cn/webservices/library/ws-soapbase/ – artbristol 2012-04-24 07:40:08