一、程序逻辑
加密-上传
浏览器发起A用户的上传请求
服务端生成会话密钥Ks,用A用户的公钥Ka进行SM2加密为密钥Ks’,发给浏览器
浏览器收到加密后的会话 密钥Ks’,用A用户的私钥Ka’进行SM2解密得到会话密钥Ks
浏览器使用会话密钥Ks,对上传文件进行SM4加密得到密文M’,发给服务端
服务端保存密文M’以及会话密钥Ks
二、技术实现
2.1 密钥传输部分(步骤1-3)
SM2证书解析
首先测试浏览器端加密狗ocx插件,可以使用ocx获取证书。
加密狗ocx测试页
经厂家确认,证书格式为X.509。将证书直接写在服务端代码内,尝试解析证书并获取公钥Ka。代码如下:
// 证书
String cert64 = "MIIBvzCCAWa…F2yvFQ==";
// base64解码
byte[] certBytes = Base64.getDecoder().decode(cert64);
InputStream inStream = new ByteArrayInputStream(certBytes);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// x509解析
X509Certificate cert = (X509Certificate)cf.gene