摘 要: 现有证书系统存在真实性、可信度、验证流程繁琐等问题,而区块链的公开透明、去中心化、不可篡改等特性使其成为解决这些问题的理想选择。本论文旨在利用区块链技术改进教育领域中证书的发放和管理流程。复现的实验项目提高证书的真实性和可信度、简化证书的验证流程、实现证书的创建、颁发、撤销的功能以及提高证书的安全性和存储效率。通过构建基于区块链的数字证书管理系统,带来了一种更加便捷、安全、高效和可信的证书发放和管理方式。
关键词: 区块链;数字证书;系统实现;学历学位
目录
1.1 背景介绍
随着区块链技术的快速发展和广泛应用,越来越多的领域开始关注并尝试利用区块链的特性来解决各种问题。其中之一就是教育领域。在传统的教育领域,学生完成学业后通常会获得纸质证书或电子文档作为资格和成绩的证明[4]。然而,现有的证书系统存在一些问题。首先,证书的真实性和可信度难以保证,容易被伪造和篡改。其次,证书的验证流程繁琐且缺乏效率,需要多方参与和大量的人工操作。此外,证书的存储和管理也面临着安全性和数据可靠性的挑战。
为了解决这些问题并提升教育证书的可信度和效率,许多教育机构和相关组织开始探索利用区块链技术来颁发和管理数字证书。区块链的公开透明、去中心化、不可篡改等特性使其成为解决上述问题的理想选择。
1.2 研究目的
本项目旨在利用区块链技术来改进和优化教育领域中证书的发放和管理流程。具体而言,项目的目标包括以下几个方面:
提高证书的真实性和可信度:通过将证书的哈希值记录到比特币网络的区块链中,确保证书的不可篡改性和可追溯性。任何人都可以通过区块链上的数据验证证书的真实性,从而消除伪造和篡改的可能性。
简化证书的验证流程:利用区块链技术,建立一个去中心化的证书系统,使得证书的验证过程更加简单、高效。学生或雇主可以直接查询区块链上的数据,无需繁琐的人工核对和多方参与。
提高证书的安全性和存储效率:借助区块链的分布式存储特性,将证书文件存储在多个节点上,确保数据的安全性和可靠性。同时,由于区块链是不可篡改的,避免了传统存储方式下数据被恶意篡改或丢失的风险。
通过实现以上目标,本项目旨在构建一个基于区块链的证书管理系统,为教育领域带来一种更加安全、高效和可信的证书发放和管理方式。同时,该系统也有助于促进教育资源的共享和合作,推动教育体系的创新和发展。
区块链技术的核心概念是将数据分散存储在网络中的多个节点上,并使用加密算法确保数据的完整性和安全性。每个区块包含了一定数量的交易记录,并通过哈希函数与前一个区块进行链接,形成一个链式结构。这种链式结构保证了区块链中的数据不可篡改,一旦有人试图篡改某个区块中的数据,其哈希值就会发生变化,从而被其他节点识别并拒绝。
比特币网络是应用区块链技术的典型代表之一。比特币是一种基于区块链的加密货币,其底层技术和架构为其他应用提供了借鉴和发展的基础。比特币网络由全球范围内的许多节点组成,这些节点通过共识算法来验证和记录交易,并保证整个网络的安全性和稳定性。通过比特币网络,可以实现对数字证书的分布式颁发和验证,确保证书的可信度和安全性。
本项目利用区块链技术和比特币网络,建立了一个安全、可信的证书颁发系统。通过将证书相关信息存储到区块链上,实现了证书的去中心化管理和验证。这使得证书的颁发和验证过程更加安全、高效和透明,避免了传统方式下的篡改和伪造风险,并减少了中间环节的不确定性。
3.1 系统概述
旨在使用区块链技术来实现机构颁发数字证书的过程。它使用比特币网络的区块链作为存储和验证证书的基础设施。创建证书文件:项目允许创建新的 PDF 证书文件,或者使用现有的证书文件,并发布哈希,将这些文件表示到比特币网络的区块链中。计算证书哈希:对证书文件进行哈希计算,生成唯一的哈希值。这个哈希值将用于代表证书,并且将被写入比特币区块链。构建 OP_RETURN 数据:使用 CRED 元协议,将证书哈希值和其他相关信息(如发行者标识符、颁发时间等)转换为 OP_RETURN 字节串。发布到比特币网络:将构建的 OP_RETURN 数据发布到比特币网络中,作为交易的一部分写入比特币区块链。任何人都可以通过查询比特币区块链上的交易数据,获取证书的哈希值,并使用该哈希值验证证书的真实性和完整性。系统还提供了三种撤销方式:撤销特定证书、撤销整个批次的证书或者撤销一个发行地址的所有证书。
3.2 系统重要结构说明
Merkle 树结构:代码使用 Merkle 树来组织证书哈希值。Merkle 树是一种二叉树结构,其中每个非叶子节点的值都是其子节点的哈希值的组合。这种结构允许高效地验证证书哈希值是否属于特定的 Merkle 根哈希值,同时减少了存储和传输的数据量。
Chainpoint v2 区块链收据:通过生成 Chainpoint v2 区块链收据,可以将证书的哈希值与区块链上的事务 ID 相关联。这样可以在区块链上查找和验证特定的证书哈希值,并提供不可否认的证据。
实现了一个数字证书存证系统,通过利用 Chainpoint v2、Merkle 树和比特币网络的区块链技术,确保了证书的不可篡改性和透明性。它提供了一种安全可靠的方式来存储和验证证书的完整性,并提供了公开可验证的证据链。可以将数字证书的哈希值存储到比特币网络的区块链上,并生成 Chainpoint v2 区块链收据。这样做可以确保证书的完整性和透明性,因为任何对证书的篡改都会导致哈希值不匹配,并且可以在区块链上追踪证书的存在。
3.3 数字证书的创建
3.3.1 证书创建的简略流程
系统创建PDF证书文件,并将代表这些文件的hash发送到比特币网络的区块链。一般流程如下:
使用包含所有毕业生的CSV填充PDF模板文件;为CSV中的每个条目创建PDF证书。
对PDF证书进行散列(sha256)并创建merkle树,其merkle根被发布到区块链中。
3.3.2 证书创建的具体细节
系统可以根据给定的模板文件(如cert_template.pdf),填充特定字段,为每个学生填写占位符(例如,姓名和成绩等)。生成新的证书文件。这样可以确保证书的格式和外观符合要求。其中CSV文件,包含填充证书模板所需的所有字段。
使用 ChainPointV2 创建 Merkle 树:系统使用 ChainPointV2 库来创建 Merkle 树。Merkle 树是一种数据结构,它将多个证书的哈希值捆绑在一起,形成一个不可篡改的数据结构。这样做的目的是为了确保证书的完整性,一旦有任何修改,Merkle 树的根哈希值就会发生变化。
将证书的 ChainPointV2 证明插入到证书的 PDF 元数据中:系统通过将证书的 ChainPointV2 证明以 JSON 格式存储为证书的 PDF 元数据,将证明与对应的证书文件关联起来。这样做的目的是为了提供验证信息,使得证书的真实性和完整性能够被验证。
发布哈希到比特币网络的区块链:提供一个公开验证的能力。在区块链上存储证书的哈希值,使得任何人都可以通过区块链进行验证,而无需依赖于中心化的机构。
3.3.3 相关代码及注释
if __name__ == "__main__":
conf = load_config()
txid = create_certificates(conf, True)
print('\nTx hash: {}'.format(txid))
def load_config():
base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
default_config = os.path.join(base_dir, 'config.ini')
p = configargparse.getArgumentParser(default_config_files=[default_config])
# 创建一个参数解析器,指定默认的配置文件路径为'config.ini'
p.add('-c', '--config', required=False, is_config_file=True, help='config file path')
# 添加一个'-c'或'--config'的参数选项,用于指定配置文件路径
p.add_argument('-d', '--working_directory', type=str, default='.', help='the main working directory - all paths/files are relative to this')
# 添加一个'-d'或'--working_directory'的参数选项,用于指定主工作目录,所有路径/文件都相对于该目录
p.add_argument('-i', '--pdf_cert_template_file', type=str, default='cert_template.pdf', help='the pdf certificate form to populate')
# 添加一个'-i'或'--pdf_cert_template_file'的参数选项,用于指定要填充的PDF证书模板文件
# ...(省略了其他参数选项的添加)
args, _ = p.parse_known_args()
# 解析命令行参数,并返回解析结果
return args
def create_certificates(conf, interactive=False):
# 检查发行地址是否已被撤销!
# TODO: REVOKE ADDRESS CMD
pdf_utils.populate_pdf_certificates(conf, interactive)
# 生成证书PDF文件
certificates_directory = os.path.join(conf.working_directory, conf.certificates_directory)
cert_files = glob.glob(certificates_directory + os.path.sep + "*.pdf")
# 获取证书文件列表,确保其与'hash_certificates'和'insert_proof_to_certificates'相同
cert_hashes = pdf_utils.hash_certificates(cert_files)
# 对证书文件进行哈希,生成哈希列表
cp = prepare_chainpoint_tree(cert_hashes)
# 使用哈希列表创建Chainpoint树
if conf.expiry_date:
op_return_bstring = cred_protocol.issue_abs_expiry_cmd(conf.issuer_identifier,
cp.get_merkle_root(),
conf.expiry_date)
else:
op_return_bstring = cred_protocol.issue_cmd(conf.issuer_identifier,
cp.get_merkle_root())
# 生成OP_RETURN命令的十六进制字符串
txid = publish_hash.issue_op_return(conf, op_return_bstring, interactive)
# 发布OP_RETURN交易
insert_proof_to_certificates(conf, cp, txid, cert_files, interactive)
# 将Chainpoint证明插入到证书PDF文件中
return txid
3.4 数字证书的颁发
3.4.1 证书颁发的简略流程
系统颁发数字证书。它发布现有的PDF证书文件,并将代表这些文件的哈希发布到比特币网络的区块链中。一般流程如下:
需要所有的PDF证书。使用带有证书数据的CSV向每个证书添加元数据;所有PDF证书现在都包含元数据。
对PDF证书进行散列(sha256)并创建merkle树,其merkle根被发布到区块链中
3.4.2 证书颁发的具体细节
代码使用pdfrw库来操作PDF文件,将区块链证明插入到每个证书的元数据中。接下来,代码创建一个ChainPointV2对象,并使用证书的哈希值构建Merkle树。然后,代码生成一个OP_RETURN命令,其中包含发行者标识符和Merkle树的根哈希值。将OP_RETURN命令发布到比特币网络上,并返回交易的哈希值。最后,代码将交易的哈希值插入到每个证书的元数据中。
3.4.3 相关代码及注释
if __name__ == "__main__":
conf = load_config()
txid = issue_certificates(conf, True)
print('\nTx hash: {}'.format(txid))
def issue_certificates(conf, interactive=False):
# 检查发行地址是否已被吊销!
# TODO: REVOKE ADDRESS CMD
pdf_utils.add_metadata_only_to_pdf_certificates(conf, interactive)
# 向PDF证书添加元数据
certificates_directory = os.path.join(conf.working_directory, conf.certificates_directory)
cert_files = glob.glob(certificates_directory + os.path.sep + "*.[pP][dD][fF]")
# 获取证书文件列表
cert_hashes = pdf_utils.hash_certificates(cert_files)
# 计算证书的哈希值
cp = prepare_chainpoint_tree(cert_hashes)
# 准备Chainpoint树
if conf.expiry_date:
op_return_bstring = cred_protocol.issue_abs_expiry_cmd(conf.issuer_identifier,
cp.get_merkle_root(),
conf.expiry_date)
else:
op_return_bstring = cred_protocol.issue_cmd(conf.issuer_identifier,
cp.get_merkle_root())
# 创建OP_RETURN字节串
txid = publish_hash.issue_op_return(conf, op_return_bstring, interactive)
# 发布OP_RETURN交易
insert_proof_to_certificates(conf, cp, txid, cert_files, interactive)
# 将证书的证明插入到证书中
return txid
3.5 数字证书的验证
3.5.1 证书验证的简略流程
验证链点PDF证书。它从PDF元数据中获取链点证明(chainpoint_proof),复制证书并移除链点证明,以获取原始证书的哈希值,并进行验证。
3.5.2 证书验证的具体流程
从PDF元数据中获取发行者地址和证明、获取发行者验证方法、获取和移除链点证明等功能。首先检查传入的证书列表,然后针对每个证书进行验证。在验证过程中,它会获取证书的发行者地址和链点证明,然后从链点证明中获取区块链和测试网络信息。如果证书有效,它还会获取发行者的验证信息,并检查发行者的验证方法。最后,根据验证输出结果。
3.5.3 相关代码及注释
def validate_certificates(conf, interactive=False):
# 验证证书有效性的函数,接受一个 conf 对象和一个可选的交互参数
if len(conf.f) >= 1:
# 如果传入的证书列表长度大于等于1
certificates = conf.f
# 将传入的证书列表赋值给变量 certificates
results_array = []
# 创建一个空数组用于存储验证结果
for cert in certificates:
# 遍历每个证书
if os.path.isfile(cert):
# 检查证书文件是否存在
filename = os.path.basename(cert)
# 获取证书文件名
if(filename.lower().endswith('.pdf')):
# 检查证书文件是否以 '.pdf' 结尾
valid, reason = validate_certificate(cert,
conf.issuer_identifier,
json.loads(conf.blockchain_services))
# 验证证书的有效性,并返回验证结果和原因
issuer_address, proof = get_issuer_address_and_proof(cert)
# 获取证书的发行者地址和链点证明
chain, testnet, _ = get_chain_testnet_txid_from_chainpoint_proof(proof,
issuer_address)
# 从链点证明中获取区块链、测试网络和交易ID信息
if valid:
# 如果证书有效
verify_issuer = get_issuer_verification(cert)
# 获取发行者的验证信息
issuer_verification = None
# 创建一个变量用于存储发行者验证方法的结果
if verify_issuer:
issuer_verification = \
network_utils.check_issuer_verification_methods(issuer_address,
verify_issuer, testnet)
# 检查发行者的验证方法是否有效
if interactive:
print('Certificate {} is valid!'.format(cert))
if reason:
print("(" + reason + ")")
if issuer_verification:
for k, v in issuer_verification.items():
if k == "domain" or k == "github":
print("Issuer verification method:", k,
"(", v['url'], ")", "->", v['success'])
else:
print("Issuer verification method:", k, "->", v['success'])
else:
results_array.append({"cert": cert, "status":
"valid", "reason": reason, "chain": chain,
"testnet": testnet, "verification": issuer_verification })
# 如果是交互模式,则打印输出验证结果信息,否则将结果存储在结果数组中
else:
if interactive:
print('Certificate {} is _not_ valid!'.format(cert))
if reason:
print("(" + reason + ")")
else:
results_array.append({"cert": cert, "status":
"invalid", "chain": chain,
"testnet": testnet, "reason": reason })
# 如果是交互模式,则打印输出无效证书的信息,否则将结果存储在结果数组中
else:
if interactive:
print('Skipping non-pdf file: {}'.format(cert))
else:
results_array.append({"cert": cert, "status": "N/A",
"chain": chain, "testnet": testnet,
"reason": "not a pdf file" })
# 如果证书文件不是以 '.pdf' 结尾,则跳过该文件,否则将结果存储在结果数组中
else:
if interactive:
print('Skipping non-existent file {}'.format(cert))
else:
results_array.append({"cert": cert, "status": "N/A",
"chain": chain, "testnet": testnet,
"reason": "file not found" })
# 如果证书文件不存在,则跳过该文件,否则将结果存储在结果数组中
return {"results": results_array}
# 返回结果数组
else:
if interactive:
exit('At least one certificate needs to be provided as an argument.')
else:
raise ValueError("no certificates provided")
3.6 数字证书的撤销
3.6.1 证书验证的流程
系统允许通过以下方式进行撤销:
撤销特定的证书:程序会读取证书文件,移除其中的Chainpoint证明,并获取原始哈希值,然后在区块链上发布撤销事务。
撤销整个证书批次:程序会根据批次的交易ID创建撤销命令,并在区块链上发布撤销事务。
撤销颁发地址的未来使用:程序会根据颁发地址创建撤销命令,并在区块链上发布撤销事务。
3.6.2 相关代码及注释
def revoke(conf, interactive=False):
if(conf.address):
txid = revoke_address(conf, interactive)
return txid
elif(conf.batch):
txid = revoke_batch(conf, interactive)
return txid
elif(conf.p):
txids = revoke_certificates(conf, interactive)
return txids
以下介绍一种的处理代码:
def revoke_address(conf, interactive=False):
# 撤销地址的函数,接受一个 conf 对象和一个可选的交互参数
# 初始化全节点连接
if(conf.testnet):
setup('testnet')
else:
setup('mainnet')
if(is_address_bech32(conf.issuing_address)):
address = P2wpkhAddress(conf.issuing_address).to_hash160()
else:
address = P2pkhAddress(conf.issuing_address).to_hash160()
# 根据地址类型选择相应的地址类,并将发行地址转换为哈希值
op_return_bstring = cred_protocol.revoke_address_cmd(address)
# 生成用于撤销地址的操作返回字节串
revoked_txid = publish_hash.issue_op_return(conf, op_return_bstring)
# 发布操作返回事务并获取撤销事务的ID
if interactive:
print('\nTx hash: {}'.format(revoked_txid))
else:
return revoked_txid
# 如果是交互模式,则打印输出撤销事务的哈希值,否则返回撤销事务的ID
-
4系统全局使用过程及试验结果
4.1 系统具体功能全局实现过程
首先,学生、学校可注册id,登录数字证书系统,学生发送相关信息,学校验证后将学历凭证形成文件,发送生成的pdf模板、学生数据相关信息给数字证书系统,系统将证书哈希值发布到比特币网络,学校方面有权撤销、修改、增加学生证书,学生方面有权查看下载证书,公司及大众方面有权上传证书,以验证证书的真实性。
图1 系统实现[3]
Figure 1 system implementation
4.2 试验结果
图2 .csv文件及创建的证书pdf
Figure 2 . csv file and created certificate PDF
5项目应用前景
随着区块链技术的快速发展和广泛应用,该项目具有非常广阔的前景,并将为数字证书颁发领域带来创新和进步。传统的数字证书颁发方式存在安全性和可信度方面的问题,而区块链技术可以解决这些问题,提高证书的安全性、可信度和透明度。
该项目在教育领域的应用前景非常广阔。通过区块链技术,学位证书的真实性和有效性可以得到确保,从而有效减少学历造假问题,保护学生和用人单位的权益。此外,该项目还可以为企业颁发的资质证书提供更加可靠的验证手段,确保企业能够获得应有的认可和信任。
除了教育领域,随着区块链技术的不断发展和应用,该项目还有许多其他领域的应用前景。例如,在医疗行业,可以使用区块链技术来确保患者的电子病历和医疗证书的安全性和真实性。在版权保护领域,可以利用区块链技术来确保数字内容的版权归属和使用权的合法性[5]。
总之,随着区块链技术在各个领域的广泛应用,该项目将为数字证书颁发领域带来重大的创新和发展,并为推动数字化社会的建设做出积极贡献。
6.总结
本文介绍了利用区块链技术改进教育领域证书发放和管理的研究。现有证书系统存在的问题包括真实性、可信度、验证流程繁琐等,而区块链的特性使其成为解决这些问题的理想选择。本项目旨在提高证书的真实性和可信度、简化证书的验证流程以及提高证书的安全性和存储效率。通过构建基于区块链的证书管理系统,该系统能够确保证书的不可篡改性和可追溯性,简化证书的验证流程,并提供安全、可靠的证书存储。这一系统不仅为教育领域带来了更安全、高效和可信的证书发放和管理方式,还促进了教育资源的共享和合作,推动了教育体系的创新和发展。
- 张芬,李腾跃.基于区块链的数字证书及电子印章系统架构[J].信息系统工程,2022(08):8-11.
- 黄立波,王伟,徐彦军等.基于区块链的数字结业证书管理系统及其性能评估[J].华东师范大学学报(自然科学版),2020(06):72-81.
- 周昌令;时旻;陈俊达;赖清楠;王博;来天平;王永超;金建栋.一种基于区块链的学校证书发布验证方法、系统和装置: 202111368461.0[P]. 2023-05-19.
- 许涛. 区块链技术在教育教学中的应用与挑战 [J]. 现代教育技术, 2017(1): 110-116.
- 袁勇, 王飞跃. 区块链技术发展现状与展望 [J]. 自动化学报, 2016, 42(4): 481-494.