51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

上交所的订单系统需要满足监管要求,如交易记录需留存至少20年,且审计日志不可篡改。请设计一个满足此需求的日志系统,说明存储方案、数据加密、访问控制及如何保证不可篡改性。

上海证券交易所A06 研究岗难度:困难

答案

1) 【一句话结论】
设计一个基于“分布式不可篡改存储(如区块链共识机制或分布式哈希表)+ S3冷热分层存储 + AES-256加密(KMS密钥管理)+ RBAC访问控制”的日志系统,通过时间戳+哈希链验证确保20年不可篡改,满足长期存储与监管合规要求。

2) 【原理/概念讲解】
首先,长期存储成本控制采用冷热数据分层:热数据(近1年)存S3标准存储(高可用,成本约0.023元/GB/月),冷数据(1-10年)迁移至S3 Glacier(成本约0.006元/GB/月),超10年归档至S3 Deep Archive(成本约0.002元/GB/月),系统定期自动触发数据迁移,降低长期存储成本。

不可篡改机制:每条日志记录生成TAU高精度时间戳,计算内容哈希(SHA-256),将“时间戳+哈希”链写入不可篡改存储(如区块链节点,通过共识机制确保多节点同步,篡改需破坏链结构,类比区块链的区块验证,若某节点篡改,其他节点会检测到哈希链不一致,拒绝验证)。

数据加密:日志内容用AES-256加密,密钥由**KMS(密钥管理服务)**管理,密钥定期轮换(如每6个月),确保密钥安全。

访问控制:采用RBAC(基于角色的访问控制),记录所有操作(读/写/删除),权限分级(监管人员全权限,普通用户仅读),操作日志加密存储(密钥与主日志密钥分离,生命周期管理,如每3个月轮换)。

3) 【对比与适用场景】

存储方案不可篡改机制数据加密适用场景注意点
区块链(如以太坊)共识机制,全网节点验证哈希链交易数据加密(智能合约)绝对不可篡改场景(如金融审计)成本高,写入延迟受共识限制,高并发场景性能瓶颈
分布式哈希表(如IPFS+Merkle树)多节点哈希链验证,篡改需破坏链结构内容加密(AES-256)长期存储,成本可控写入延迟较高,需维护多节点同步,网络故障可能影响验证
传统数据库(如HDFS)本地日志校验(易被篡改)传输加密(TLS),存储加密(KMS)大规模日志存储,高可用需额外不可篡改链,成本高,验证流程复杂

4) 【示例】
伪代码(日志写入流程,含错误处理):

import hashlib, time, json
from cryptography.fernet import Fernet
from tau_service import TAU  # 假设TAU提供高精度时间戳
from blockchain_api import Blockchain  # 假设区块链节点API
from s3_client import S3Client  # 假设S3客户端

# 1. 获取时间戳(TAU服务)
try:
    ts = TAU.get_timestamp()  # 返回精确时间戳
except Exception as e:
    print(f"获取时间戳失败: {e}")
    return

timestamp = ts

# 2. 准备日志内容
log_entry = {
    "order_id": "ORD20240101-001",
    "price": 100.5,
    "quantity": 100,
    "user_id": "U001"
}

# 3. 加密日志内容(AES-256)
try:
    key = Fernet.generate_key()  # 由KMS提供主密钥,生成子密钥
    cipher_suite = Fernet(key)
    encrypted_log = cipher_suite.encrypt(json.dumps(log_entry).encode('utf-8'))
except Exception as e:
    print(f"加密失败: {e}")
    return

# 4. 计算内容哈希
content_hash = hashlib.sha256(encrypted_log).hexdigest()

# 5. 写入不可篡改存储(区块链节点)
try:
    blockchain = Blockchain()
    blockchain.add_hash(content_hash, timestamp)  # 假设区块链节点API
except Exception as e:
    print(f"写入区块链失败: {e}")
    return

# 6. 存储加密日志到S3(冷热分层)
try:
    s3 = S3Client()
    s3.put_object(
        Bucket="shsz-order-logs",
        Key=f"logs/{timestamp}.log",
        Body=encrypted_log,
        StorageClass="STANDARD"  # 热数据(近1年)
    )
    # 1-10年迁移至Glacier,超10年归档至Deep Archive(系统自动处理)
except Exception as e:
    print(f"S3存储失败: {e}")
    return

# 7. 记录访问控制日志(加密存储,密钥分离)
access_key = Fernet.generate_key()  # 访问控制日志专用密钥
access_cipher = Fernet(access_key)
access_log = {
    "action": "write",
    "user": "监管人员",
    "timestamp": ts,
    "log_id": content_hash
}
try:
    access_log_enc = access_cipher.encrypt(json.dumps(access_log).encode('utf-8'))
    s3.put_object(
        Bucket="shsz-access-logs",
        Key=f"logs/{timestamp}.log",
        Body=access_log_enc,
        StorageClass="GLACIER"  # 冷数据(1-10年)
    )
except Exception as e:
    print(f"访问控制日志存储失败: {e}")
    return

5) 【面试口播版答案】
面试官您好,针对上交所订单系统20年存储和不可篡改需求,我设计系统:首先,存储用S3冷热分层,热数据(近1年)存标准存储,冷数据(1-10年)归档至Glacier,超10年归档至Deep Archive,控制成本。不可篡改通过时间戳+哈希链,写入区块链节点,多节点验证防篡改。数据加密用AES-256,KMS密钥每6个月轮换。访问控制用RBAC,操作日志密钥分离管理。这样既满足长期存储,又保证数据完整性和不可篡改,符合监管要求。

6) 【追问清单】

  • 问题1:如何控制20年存储成本?
    回答要点:冷热数据分层,热数据(近1年)用S3标准存储(0.023元/GB/月),冷数据(1-10年)迁移至S3 Glacier(0.006元/GB/月),超10年归档至S3 Deep Archive(0.002元/GB/月),系统定期自动触发数据迁移,降低长期成本。
  • 问题2:日志读取时如何验证不可篡改?
    回答要点:读取日志时,先从区块链节点获取哈希链,计算当前日志内容的哈希,若与链中哈希匹配则验证通过,否则标记为篡改;多节点同步哈希链,确保链完整性。
  • 问题3:系统故障时如何恢复?
    回答要点:日志存储多副本节点,区块链哈希链提供校验,确保数据一致性;加密密钥备份,避免密钥丢失导致数据无法访问。
  • 问题4:如何处理实时审计需求?
    回答要点:访问控制日志实时写入,结合Kafka+Flink流处理,生成审计报告,支持实时查询。

7) 【常见坑/雷区】

  • 坑1:密钥轮换周期未明确,只说KMS管理但未提及周期,导致密钥泄露风险。
  • 坑2:认为区块链是唯一不可篡改方案,忽略分布式哈希表的成本和性能,高并发写入可能延迟。
  • 坑3:访问控制日志未加密或密钥与主日志密钥未分离,导致操作日志泄露。
  • 坑4:不可篡改验证流程不具体,只说“哈希链”但未解释读取时如何验证,缺乏操作性。
  • 坑5:冷热分层触发条件不明确,导致冷数据长期存储成本过高,未采用自动迁移策略。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1