我正在構建一個客戶端/服務器基礎結構的應用程序,並希望使用公鑰/私鑰方法實現驗證機制。使用公鑰/私鑰簽名進行身份驗證:什麼是好消息(摘要)?
我們假設客戶端擁有私鑰並且服務器只有公鑰。在認證期間,客戶端用私鑰簽名消息,將其發送到使用公鑰驗證的服務器。如果驗證成功,則客戶端通過身份驗證。
下面是一些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