使用硬件令牌签名文件
Signing file with hardware token
我正在尝试使用 SafeNet eToken5110 签署一些文件。我已经设法从中获得证书,但发现我无法导出私钥。我用通用证书为 encrypt/decrypt 文件开发了一些代码,现在我的问题是对 eToken 做同样的事情。但我找不到任何信息如何做到这一点。
有小费吗?有什么 API 吗? (和 documentation/examples)
好的,我已经找到了如何使用硬件令牌对 smtx 进行签名,我希望有人会觉得它有用。需要使用 Signature class 和 SunPKCS11 provider
public static byte[] sign(byte[] file) throws Exception {
char password[] = "12345678".toCharArray();
Provider userProvider = new sun.security.pkcs11.SunPKCS11("C:\ForJava\eToken.cfg");
KeyStore ks = KeyStore.getInstance("PKCS11", userProvider);
ks.load(null, password);
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Security.addProvider(userProvider);
//Working only with the first alias on the token
String alias = (String)ks.aliases().nextElement();
Signature signature = Signature.getInstance("SHA256withRSA");
PrivateKey privateKey = (PrivateKey) ks.getKey(alias, password);
signature.initSign(privateKey);
signature.update(file);
byte[] result = signature.sign();
//System.out.println("result coding: \n" +new BASE64Encoder().encode(result));
return result;
}
要验证签名数据,您可以使用以下代码
public static void verify(byte[] sig, byte[] original) throws Exception {
Keystore keystore = initKeystore();
PublicKey key = keystore.getCertificate(getCertAlias()).getPublicKey();
Signature s = Signature.getInstance("SHA256withRSA");
s.initVerify(key);
s.update(original);
if ( ! s.verify(sig)) {
System.out.println("Signature check FAILED");
return;
}
System.out.println("Signature check PASSED");
}
我正在尝试使用 SafeNet eToken5110 签署一些文件。我已经设法从中获得证书,但发现我无法导出私钥。我用通用证书为 encrypt/decrypt 文件开发了一些代码,现在我的问题是对 eToken 做同样的事情。但我找不到任何信息如何做到这一点。 有小费吗?有什么 API 吗? (和 documentation/examples)
好的,我已经找到了如何使用硬件令牌对 smtx 进行签名,我希望有人会觉得它有用。需要使用 Signature class 和 SunPKCS11 provider
public static byte[] sign(byte[] file) throws Exception {
char password[] = "12345678".toCharArray();
Provider userProvider = new sun.security.pkcs11.SunPKCS11("C:\ForJava\eToken.cfg");
KeyStore ks = KeyStore.getInstance("PKCS11", userProvider);
ks.load(null, password);
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Security.addProvider(userProvider);
//Working only with the first alias on the token
String alias = (String)ks.aliases().nextElement();
Signature signature = Signature.getInstance("SHA256withRSA");
PrivateKey privateKey = (PrivateKey) ks.getKey(alias, password);
signature.initSign(privateKey);
signature.update(file);
byte[] result = signature.sign();
//System.out.println("result coding: \n" +new BASE64Encoder().encode(result));
return result;
}
要验证签名数据,您可以使用以下代码
public static void verify(byte[] sig, byte[] original) throws Exception {
Keystore keystore = initKeystore();
PublicKey key = keystore.getCertificate(getCertAlias()).getPublicKey();
Signature s = Signature.getInstance("SHA256withRSA");
s.initVerify(key);
s.update(original);
if ( ! s.verify(sig)) {
System.out.println("Signature check FAILED");
return;
}
System.out.println("Signature check PASSED");
}