JAVA代码生成licence.cer和licence.keystore,使用python完成桌面工具,完成签名及验签功能
- 知识点一:加载java代码生成的.keystore文件
keystore = jks.KeyStore.load(jks_file, passphrase)
- 知识点二:库文件安装
1. pip install pyopenssl
2. pip install pyjks 使用该库需要microsoft c++ 14
链接:https://pan.baidu.com/s/1BWERHiFk7T-8cFBUk4KIbw 提取码:cscs
from OpenSSL import crypto
import OpenSSL
import base64
import jks
_ASN1 = OpenSSL.crypto.FILETYPE_ASN1
def jksfile2context(jks_file, passphrase, key_alias, key_password=None):
'''
:param jks_file: keystore文件
:param passphrase: keystore文件存储密码
:param key_alias: 私钥别称
:param key_password: 私钥加密解密密码
:return: 私钥对象,证书对象
'''
keystore = jks.KeyStore.load(jks_file, passphrase)
pk_entry = keystore.private_keys[key_alias]
# if the key could not be decrypted using the store password, decrypt with a custom password now
if not pk_entry.is_decrypted():
pk_entry.decrypt(key_password)
pkey = OpenSSL.crypto.load_privatekey(_ASN1, pk_entry.pkey)
public_cert = OpenSSL.crypto.load_certificate(_ASN1, pk_entry.cert_chain[0][1])
print(public_cert)
return keystore, pkey, public_cert
def get_verify(data, signature, public_cert):
'''
:param signature: 签名
:param public_cert: 证书对象
:return:
'''
signature = base64.decodebytes(signature.encode("utf8"))
try:
crypto.verify(public_cert, signature, data, 'sha1') # content传参时byte型需要encode解码下,验签通过返回的为None,验签失败则会返回异常
result = True
except:
result = False
return result
def sign(pkey, data):
# 签名
signature = crypto.sign(pkey, data, 'sha1')
result = base64.encodebytes(signature) # 签名结果base64编码
result_sign = result.decode('utf8').replace('\n', '')
return result_sign
if __name__ == '__main__':
keystore, pkey, public_cert = jksfile2context('./licence.keystore', 'shouhux123', 'base', key_password=None)
data = '184804103800452-54-00-13-3C-E57ad0c023c1c74f7694cc782c7916e84d科技有限公司'
data2 = '284804103800452-54-00-13-3C-E57ad0c023c1c74f7694cc782c7916e84d科技有限公司'
# 验签
print(get_verify(data2, sign(pkey, data), public_cert))