图解支付-金融级密钥管理系统:构建支付系统的安全基石
经常在网上看到某某公司几千万的个人敏感信息被泄露,这要是放在持牌的支付公司,可能就是一个非常大的麻烦,不但会失去用户的信任,而且可能会被吊销牌照。而现实情况是很多公司的技术研发人员并没有足够深的安全架构经验来设计一套高度安全的密钥管理系统。
今天我们解构金融级别的密钥管理系统设计与实现,讲清楚如何设计密钥分级体系,密钥轮换机制,如何兼顾存储安全与运算速度,跨机房容灾方案等技术细节。
安全行业有句俗话:“密钥的价值等于数据的价值”,如果你对数据安全感兴趣,或想加固自己公司的数据安全级别,或好奇金融级别的安全体系相关知识,欢迎和墨哥一起探索如何设计一个金融级的密钥管理系统。
1. 前言
在当今数字化经济的浪潮中,支付系统扮演着极其关键的角色,支付系统面临的安全挑战也日益增加,尤其是数据泄露事件频发,对信任机制和整个支付生态系统构成了严重威胁。在这样的背景下,高度安全的金融级密钥管理系统(KMS)的作用变得尤为重要,它是确保支付系统安全的关键技术之一。
密钥管理系统涵盖了密钥的生命周期管理,包括密钥的生成、分发、使用、存储、轮换和销毁等环节,旨在通过严格的安全措施保护密钥不被未授权访问,从而确保交易数据的安全。当然,有效的密钥管理不仅仅是技术问题,它还涉及到政策、流程、人员等多个方面,需要系统性的设计和实施。
本文旨在通过图解的方式,深入浅出地介绍金融级密钥管理系统的设计和实现,帮助读者理解其在构建安全支付系统中的关键作用。我们将从密钥管理的基本概念出发,逐步深入到产品架构、系统架构、部署架构以及设计细节等多个层面,全面展示如何在支付系统中实施有效的密钥管理策略及应用。
希望通过本文的介绍,能够为在线支付系统的工程师、架构师们提供实用的参考指南。
2. 术语
在深入探讨密钥管理系统(KMS)之前,理解以下核心术语对于把握整个系统的设计和功能至关重要,它们构成了加密和密钥管理领域的基本词汇,是进一步讨论的基础。
- 密钥(Key):
密钥是一串用于加密和解密数据的信息,是保护数据不被未授权访问的基础。根据用途和级别,密钥可分为主密钥、工作密钥等。 - 主密钥/本地主密钥(Master Key / Local Master Key):
作为密钥管理体系中最高级别的密钥,主密钥用于加密和保护其他密钥(如工作密钥)。由于其重要性,通常由硬件加密机(也称为:硬件安全模块(HSM))生成和存储,确保其安全性,所以也经常称为本地主密钥。 - 区别主密钥(Zone Master Key):
区别主密钥,用于密钥传输前的加密。比如要把工作密钥传输到各安全服务中心,就需要使用ZMK先加密工作密钥。一般使用公私钥来做,后面有详细说明。 - 工作密钥(Working Key):
直接用于业务数据的加解密操作。工作密钥由主密钥加密保护,以保障其安全。 - 数据加密密钥(Data Encryption Key,DEK):
专门用于加密和解密业务数据的密钥。在某些文献中,工作密钥和数据加密密钥可以是同一概念。 - 密钥加密密钥(Key Encryption Key,KEK):
专门用于加密和解密工作密钥的密钥。在分布式环境下,我们需要把一些工作密钥缓存在各机房的安全服务中心,就使用KEK加密后缓存,而不是缓存明文。 - 硬件安全模块(Hardware Security Module,HSM):
一种物理设备,专门用于生成、存储和管理数字密钥。就是我们俗称的硬件加密机。HSM提供了物理隔离和高级安全功能,确保密钥的安全。 一般只能由特定授权的公司才能生产。在银行业,执牌金融机构基本都需要使用硬件加密机。 - 密钥生命周期(Key Lifecycle):
描述了密钥从生成到销毁整个过程中的各个阶段,包括生成、分发、激活、使用、轮换、废弃和销毁等。 - 密钥轮换(Key Rotation):
定期更换密钥的过程。通过轮换密钥,可以减少密钥被破解的风险,增强系统的安全性。 - 双因素认证(Two-Factor Authentication,2FA):
一种安全措施,要求用户提供两种不同形式的身份验证,通常是密码和物理令牌或手机接收到的一次性密码(OTP),用于增强安全性。 比如在硬件加密机维护时,需要用户插入管理卡,并输入密码。 - 数字签名(Digital Signature):
使用私钥签名,公钥验签。用于验证消息或文档的完整性和来源的真实性。 - 加密(Encryption):
数据保护手段,将明文数据通过特定的算法和密钥转换成密文数据,需要解密后才能再次读取明文数据。常见的加密算法包括AES、RSA等。
这些术语部分不好理解,补充几个图如下:
主密钥生成与保存:硬件运算生成,保存到安全芯片。
主密钥作用:加密工作密钥,用于保存DB.
工作密钥:用于加密业务明文数据。
区域主密钥:加密工作密钥用于传输。
密钥加密密钥:加密工作密钥用于缓存,加速本地运算。
3. 建设目标
在设计和实施密钥管理系统(KMS)时,需要达成以下主要目标:
- 确保数据安全:最核心的目标是保护支付系统中敏感数据的安全,防止数据泄露、篡改或未授权访问。密钥管理系统应确保所有需要加密的业务数据在存储和传输过程中均经过加密保护。
- 支持密钥全生命周期管理:系统应提供密钥的生成、分发、使用、存储、轮换、废弃和销毁等全生命周期管理功能,确保密钥的安全性和有效性。
- 满足合规性要求:遵守相关的行业安全标准和法律法规,确保支付系统的合规性。
- 提高系统可用性和灵活性:通过支持密钥的快速轮换和备份恢复功能,提高系统对密钥泄露等安全事件的响应能力,保障业务连续性。
- 简化管理工作和降低运营成本:通过自动化的密钥管理流程和直观的管理界面,简化管理员的操作,降低管理成本和运营成本。
- 支持多种密钥类型和算法:适应不同加密需求,支持多种密钥类型和加密算法,提供灵活的密钥解决方案。
- 实现高性能和可扩展性:保证在高并发场景下的性能需求,支持业务的快速增长和系统的横向扩展。
- 提供强大的访问控制和审计功能:实现基于角色的访问控制(RBAC),记录详细的操作日志,支持安全审计和事后分析。
- 用户友好的操作界面:提供直观易用的管理界面,降低操作复杂度,提高用户体验。
- 支持灾难恢复和数据备份:构建高可用的密钥管理架构,实现密钥的及时备份和灾难恢复,确保关键业务数据的持久安全。
上面写得有虚,但确实是指导思路,一个完备、安全的密钥管理系统需要达到上述要求。
4. 系统架构
简化版本系统架构:
在密钥管理系统中,因为考虑分布式与安全网络隔离的问题,所以需要分开设置三个子系统:
- 安全服务中心:提供加密、解密、签名、验签、访问控制等基础能力。可水平扩展。
- 密钥存储中心:负责密钥的存储、轮换等基础能力。独立网络隔离区。
- 管理中心:提供后台管理能力,比如配置密钥、授权密钥给应用,对接硬件加密机(HSM)等。
- 硬件加密机(HSM):负责保存主密钥,并对工作密钥进行加密。
在下面的部署架构中,我们回看这个图,就明白为什么要切成三个。
另外,里面的子功能设计,可以参考后面的“设计细节”章节。
详细功能的系统架构:
5. 部署架构
在构建密钥管理系统(KMS)时,部署架构的设计直接影响到系统的可用性、扩展性和安全性。对于支付系统而言,必须考虑到业务的高可用性和灵活性需求,采用分布式部署架构是一种必然的选择。
核心设计原则
- 高可用性:通过在多个数据中心分布式部署密钥管理系统的实例,即使某个数据中心发生故障,其他实例仍然可以提供服务,从而保证系统的高可用性。
- 灵活扩展性:随着业务量的增长,系统可以通过增加节点的方式横向扩展,灵活应对业务需求的变化。
- 数据一致性:采用先进的数据同步技术,确保各节点间密钥信息的一致性,避免数据不一致导致的安全问题。
- 安全隔离:在不同的物理位置部署密钥管理服务,可实现安全隔离,降低单点攻击的风险。
- 灾难恢复:通过地理上分散的部署,结合有效的备份和恢复策略,确保在发生灾难时可以快速恢复服务。
分布式部署架构
- 中心管理节点:负责整个密钥管理系统的中心控制,包括策略制定、访问控制、审计日志等核心管理功能。
- 区域管理节点:在各个地理区域部署,负责处理该区域内的密钥请求,实现数据处理的地理近邻性,优化响应时间。
- 数据同步机制:确保所有区域管理节点间的数据一致性和实时性,采用可靠的数据同步技术,如同步复制或异步复制。
- 安全网络:所有节点通过安全的网络连接,确保数据传输的安全性和加密,防止数据在传输过程中被截获或篡改。
下面是一个部署简图:
一时没有找到防火墙常用图标,先将就着看。
核心要点:
- 密钥存储中心和硬件加密机部署在隔离区。
- 管理中心部署在管理区或者隔离机房,建议参考安全团队的建议。
- 安全服务中心部署在各应该APP所在机房,就近提供加解密、签验签等运算服务。可水平扩展。
- 安全服务中心有本地缓存,在隔离机房短时间内无法连接时,仍然可以正常提供服务。
6. 设计细节
6.1. 数据流图
核心有4个步骤:
- 初始化主密钥。
- 配置工作密钥。
- 同步工作密钥到各节点的安全服务中心。
- 实际执行加密解密、签名验签服务。
6.2. 密钥分级设计
在构建支付系统的密钥管理系统(KMS)时,密钥分级设计是确保密钥安全性的基础。通过将密钥分为不同的级别并应用不同的管理和保护策略,可以有效地降低密钥泄露的风险,提升系统的安全性。以下是密钥分级设计的核心要素:
- 主密钥/本地主密钥(Master Key / Local Master Key):
-
- 级别:最高级别,作为其他密钥的根密钥。
- 保护:存储于硬件安全模块(HSM)中,采用物理和逻辑双重保护机制,确保其安全性。
- 用途:用于加密和解密工作密钥,不直接参与业务数据的加解密。
- 管理:由最高权限的安全管理员进行管理,严格控制访问和操作。维护时一般需要3名管理员+1名操作员同时在场,管理员和操作员都有自己的物理管理卡和独立操作密码,全部验证通过后才能操作。
- 工作密钥(Working Key):
-
- 级别:次级别,用于实际的业务数据加解密操作。
- 保护:由主密钥加密保护,存储在加密数据库或安全配置文件中。
- 用途:直接用于加密和解密业务数据,例如用户信息、交易数据等。
- 管理:支持自动轮换和更新,减少手动干预,提高管理效率和安全性。
需要说明的是,严格意义上说,区域主密钥也是保存在硬件加密机中的。但在实现时,如果在区域节点不想部署硬件加密机,就可以生成公私钥对,把私钥放在区域节点,公钥放在密钥存储中心。
密钥分级设计的优势:
- 分层保护:通过对密钥进行分级管理,构建了多层防御体系,即便低级别密钥被泄露,也不会直接威胁到系统的根本安全。
- 灵活管理:主密钥和工作密钥的分离,使得密钥轮换和更新更加灵活高效,同时减少了主密钥的使用频率,降低了安全风险。
- 性能与安全的平衡:通过在不同层级应用不同的密钥,可以在保证安全的前提下,优化系统性能,特别是对于高频率的业务数据加解密操作。因为硬件加密机的运算效率有限,且采购及运维成本高昂,不便于水平扩展。
密钥分级设计是构建高安全性支付系统不可或缺的一环,它为密钥的安全管理提供了一套完整的框架。
6.3. 访问控制
在构建支付系统的密钥管理系统(KMS)中,实现严格的访问控制机制是保障系统安全的关键。访问控制的主要目的是确保只有授权用户或应用才能访问和操作密钥,同时保护密钥不被非法导出或滥用。以下是访问控制的三个核心部分:
- 用户分级管理
- 用户角色和权限:系统应定义不同的用户角色,每种角色具有不同的权限级别。例如,系统管理员拥有最高权限,可以管理用户和密钥策略;安全管理员负责主密钥的管理,包括生成、备份和恢复等操作;普通用户只能使用工作密钥进行日常的加解密操作。
- 主密钥操作的物理安全:主密钥的操作,如生成、备份和恢复,只能由特定的安全管理员在物理安全的环境下通过硬件安全模块(HSM)直接操作。这样的操作需记录详细的审计日志,并且在执行关键操作时需要多人同时在场。
- 工作密钥的审批流程:导出工作密钥或进行敏感操作时,需要通过多层审批流程。审批流程中涉及的每一步都应有清晰的操作记录和日志,以便于事后审计和追踪。
2. 密钥与应用的绑定
- 应用级访问控制:每个密钥应指定可访问的应用列表。只有列表中的应用才能使用对应的密钥进行加解密或签名验签操作。这样可以有效防止密钥被非授权应用使用,增强密钥的安全性。
- 密钥使用策略:对于每个密钥,可以定义详细的使用策略,包括使用的时间窗口、IP地址范围、访问频率等。这些策略可以在KMS中配置,并由系统强制执行。 但因为主要提供内网应用使用,一般很少这么限制。
3. 加密解密和签名验签的集中处理
- 密钥的集中处理:所有的加密解密和签名验签操作都应通过密钥管理系统集中完成。通过API调用或服务接口的形式提供给外部应用,避免直接暴露密钥。
- 工作密钥的保护:工作密钥应始终存储在加密形式,且不能被导出或直接读取。所有密钥操作都在KMS内部完成,确保密钥的安全。
通过这种分层的访问控制机制,结合用户分级管理、密钥与应用的绑定以及加密解密和签名验签的集中管理,可以有效地保护密钥不被未授权访问和使用,从而为支付系统提供坚实的安全保障。
6.4. 工作密钥版本管理
在密钥管理系统(KMS)中,工作密钥版本管理是一个关键的安全措施,主要通过定时轮换机制来增强系统的安全性。此机制确保即使旧密钥被泄露,攻击者也无法利用它来破解过去或未来的加密数据。以下是工作密钥版本管理的主要方面:
定义密钥版本
- 版本命名:为每个工作密钥定义唯一的版本标识符,通常包括密钥ID和版本号。
- 版本属性:记录每个版本的关键属性,如创建时间、启用时间、过期时间和状态(激活、过期、废弃)。
定时轮换机制
- 自动轮换:通过预设的策略自动轮换工作密钥。例如,根据最佳实践或合规要求,可以设置每三个月自动生成新的工作密钥版本并切换至新版本。
- 轮换通知:在轮换发生前,系统应发送通知给相关的系统管理员和应用,确保它们准备好迁移到新的密钥版本。
- 平滑过渡:在新旧版本切换期间,保持旧版本的可用性一段时间,以便完成未处理的加密操作,然后逐步淘汰旧版本。
版本回滚
- 应急回滚:在发现新版本密钥存在问题时,系统应支持快速回滚至前一个稳定版本,以保障业务连续性。
密钥版本跟踪与审计
- 版本历史记录:维护每个工作密钥的版本历史记录,包括每个版本的使用情况和更换原因。
- 审计日志:记录所有密钥版本操作的详细审计日志,包括版本创建、启用、废弃和删除等,以支持安全审计和合规性检查。
一个简单的实现方案
对于内部数据,直接在密文的前面加上5位数的版本号。这样数据和密钥版本就形成一个绑定关系。
通过实施工作密钥版本管理和定时轮换机制,KMS能够有效降低密钥泄露的风险,提升支付系统的整体安全性。此外,该机制还有助于满足行业安全标准和合规要求,如PCI-DSS等,进一步保护敏感数据的安全。
6.5. 隔离部署
隔离部署是加强支付系统密钥管理系统(KMS)安全性的一个重要策略,它通过物理或逻辑手段,将敏感组件和操作环境与其他系统部分分离,从而减少潜在的安全威胁和风险。以下是实施隔离部署的关键考虑因素:
物理隔离
- 硬件安全模块(HSM)部署:将存储和管理主密钥的硬件安全模块(HSM)物理隔离在受控的安全环境中,例如专用的安全机房。这样做不仅提高了主密钥的安全性,而且防止了未经授权的物理访问。
- 独立的密钥管理网络:建立一个独立的网络环境专门用于密钥管理操作,与生产网络和办公网络隔离,避免潜在的跨网络攻击。
网络隔离
- 防火墙和网络分段:使用防火墙和网络分段技术,将密钥管理系统与外部网络及其他内部系统分离,防止潜在的网络攻击和数据泄露。
- 加密通信:确保所有进出密钥管理系统的网络通信都采用加密协议,如TLS,保护数据传输的安全性。
数据隔离
- 敏感数据加密:确保存储和传输的所有敏感数据(包括密钥和加密的业务数据)都经过加密,即使数据被非法访问,也无法被解读。
- 备份与恢复策略:对密钥和关键配置数据实施定期备份,并将备份数据存储在与生产环境隔离的安全位置,同时确保快速恢复能力以应对可能的灾难事件。
通过实施隔离部署策略,KMS能够有效地降低安全威胁,提高支付系统的整体安全性和稳定性。隔离部署不仅有助于防御外部攻击,也能减轻内部错误或滥用所带来的风险。
6.6. 性能设计
在密钥管理系统(KMS)的设计中,性能是一个不可忽视的关键要素。一个高性能的KMS能够保证在密钥生成、存取、更新以及加密服务的过程中,响应迅速,满足支付系统等高并发环境下的需求。以下是构成KMS性能设计的主要策略:
缓存机制
- 密钥缓存:对频繁访问的工作密钥和会话密钥实施缓存,减少对密钥存储库的直接访问,也减少对硬件加密机的访问,提高响应速度。使用合适的缓存策略(如LRU算法)来管理缓存密钥的生命周期,确保密钥的即时更新和过期密钥的清除。同时
负载均衡与水平扩展
- 请求分发:采用负载均衡技术在多个KMS节点之间分发请求,平衡系统负载,提高处理能力。一般的分布式部署架构都支持。
- 水平扩展:因为工作密钥被缓存在本地运算节点,所以安全服务中心可以水平扩展,而不受限于硬件加密机。
并行处理
- 多线程操作:加解密等这些操作是运算优先型业务,应减少线程数,以减少CPU的切换损耗。
通过上述性能设计策略,KMS能够满足高并发、低延迟的性能要求。以前实测下来,单机AES加解密能到2万左右的QPS。
6.7. 容灾设计
在构建密钥管理系统(KMS)时,容灾设计是确保系统在面对硬件故障、软件错误、人为操作失误或自然灾害等情况下仍能保持业务连续性和数据完整性的关键。以下是容灾设计的核心要素:
数据复制与同步
- 跨地域复制:为了保证数据的高可用性和持久性,重要数据(包括密钥材料、配置信息等)应跨多个地域进行复制。使用实时数据复制技术确保各地域数据的一致性。
- 异地备份:定期将关键数据异地备份,以防单点故障导致的数据丢失。备份数据应加密存储,以保护其安全性。
自动故障转移
- 故障检测与自动转移:实现系统的自动故障检测机制,一旦检测到服务异常或系统故障,能够自动将请求转移到备用系统或节点,确保服务不间断。
- 负载均衡:通过负载均衡技术分配请求到健康的服务节点,提高系统整体的稳定性和可用性。
系统冗余设计
- 冗余硬件:在关键组件上采用冗余设计,比如同一机房需要部署多台硬件加密机(HSM),以减少单点故障的风险。
- 服务冗余:部署冗余的服务实例,包括数据库、应用服务器等,确保任何单一实例的故障都不会影响到整个系统的运行。 这也是在线服务部署的常规动作。
容灾演练
- 定期演练:定期进行容灾演练,验证和改进容灾计划的有效性,确保在真正的灾难发生时能够快速、有效地恢复服务。
- 演练反馈:对容灾演练的结果进行分析,并根据反馈优化容灾计划和技术方案。
通过上述容灾设计措施,KMS能够在面对各种不可预测的故障和灾害时,保证密钥服务的持续可用性和数据的完整性,为支付系统等关键业务提供坚实的安全基础。
7. 常见误区
在工作和同事的交流中,发现对于密钥的保存和使用有几个常见误区:
- 硬编码密钥:在代码中硬编码密钥,或者将密钥以明文形式存储在配置文件中。这使得密钥容易被未授权的人访问,尤其是在源代码公开或配置文件被泄露的情况下。
- 密钥复用:为了简化管理,使用同一个密钥进行多种不同的加密任务。这种做法大大增加了密钥被破解的风险,一旦密钥被破解,所有使用该密钥加密的数据都会受到威胁。
- 硬编码密钥:在代码中硬编码密钥,或者将密钥以明文形式存储在配置文件中。这使得密钥容易被未授权的人访问,尤其是在源代码公开或配置文件被泄露的情况下。
- 忽视密钥的生命周期管理:一旦生成密钥,就不再更换或更新。不定期轮换密钥会增加密钥被破解的风险,且一旦密钥泄露,长期内的数据都将不再安全。
- 不适当的密钥存储:将密钥存储在不安全的环境中,例如普通的数据库或文件系统。未经加密保护的密钥容易被窃取,尤其是在遭受数据泄露或系统入侵时。
- 缺乏合适的访问控制:对密钥访问权限控制不严,未实施基于角色的访问控制(RBAC)。这可能导致未授权用户访问和使用密钥,增加内部威胁的风险。
这里面部分原因是安全的专业知识不够,或者图一时方便,或者条件不具备(比如无法采购硬件加密机,或研发资源不足),但不无论如何,密钥的保存和使用是一整套完整的策略和落地,需要公司中高层重视才有完整落地的可能性。
8. 最佳实践
8.1. 实施步骤
总体而言,文章涉及的方案设计所涉及的知识储备及研发资源都是比较高的,对于一些中小公司来,建议分步骤实施:
- 明确密钥管理和使用的规范。
- 建设一个基础的密钥管理系统,统一管理和使用密钥。
- 对密钥管理系统进行网络和安全加固,比如独立网段,访问控制,硬件加密机等。
8.2. 用户密码管理
用户密码在所有公司都是有的,登录密码,支付密码等归属这类。也经常在网上看到新闻说一些大公司的用户密码是明文保存在数据库中并被泄露。
密码设计需要遵守以下几个准则:
- 前端需要非对称加密后传给后端。
- 后端需要解密后,再加上盐值重新对称加密后保存到DB。
为什么使用用户盐值?因为每个用户的盐值都不一样,这样即使两个用户原始密码是一样的,加密出来的密文也是不一样的。
为什么前端需要非对称加密?因为公钥是可以公开的。
为什么后端需要对称加密用户的密码,而不是使用散列?因为可以做密钥轮换。如果不考虑密钥轮换,可以使用SHA256散列算法。
为什么使用硬件加密机?因为更安全,没有条件的情况下,那就使用SHA256散列算法更安全。
这里给一个简单的实现参考。
说明:
- 首先由加解密服务生成RSA公钥,给到前端。
- 用户输入的密码,经RSA公钥加密后转到后端,后端读取用户盐值,一起传给加解密服务进行转加密。
- 加解密服务先使用RAS私钥解密,然后重新把密码明文和盐值对称加密返回。
- 后端保存密码密文到数据库。
9. 结束语
正如开头说的“密钥的价值等于数据的价值”,如果你的数据价值无可估量,那么你的密钥价值也是无可估量的。无论对于支付系统还是非支付类系统,密钥管理是同样重要的。构建一个高效、安全且可靠的密钥管理系统(KMS)不但是支付系统设计中的核心任务,也是每家互联网公司开展业务的核心任务,只是有很多公司没有意识到这点。
通过今天这篇文章,我们深入探讨了金融级密钥管理系统的基本概念、设计原则、以及核心的架构方案,旨在为读者提供一个全面、深入的视角来理解KMS在支付系统中的关键作用及如何设计与实现。此外,我们还讨论了如何通过密钥的分级管理、访问控制、工作密钥版本管理、隔离部署、性能设计和容灾设计等细节设计,确保密钥的安全性和系统的稳定性。整个设计虽然有点复杂,尤其是对没有安全经验的研发同学来说,但是在支付的世界里,安全是最基础的要求。
最后,感谢阅读和关注,希望这篇文章能够对你的工作有用。
这是《百图解码支付系统设计与实现》专栏系列文章中的第(28)篇。和墨哥(隐墨星辰)一起深入了解支付系统的方方面面。
精选
专栏地址:百图解码支付系统设计与实现
《百图解码支付系统设计与实现》专栏介绍
《百图解码支付系统设计与实现》专栏大纲及文章链接汇总(进度更新于2023.2.4)
领域相关(部分):
支付行业黑话:支付系统必知术语一网打尽
跟着图走,学支付:在线支付系统设计的图解教程
图解收单平台:打造商户收款的高效之道
图解结算平台:准确高效给商户结款
图解收银台:支付系统承上启下的关键应用
图解支付引擎:资产流动的枢纽
图解渠道网关:不只是对接渠道的接口(一)
技术专题(部分):
交易流水号的艺术:掌握支付系统的业务ID生成指南
揭密支付安全:为什么你的交易无法被篡改
金融密语:揭秘支付系统的加解密艺术
支付系统日志设计完全指南:构建高效监控和问题排查体系的关键基石
避免重复扣款:分布式支付系统的幂等性原理与实践
支付系统的心脏:简洁而精妙的状态机设计与核心代码实现
精确掌控并发:固定时间窗口算法在分布式环境下并发流量控制的设计与实现
精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现
相关文章:

图解支付-金融级密钥管理系统:构建支付系统的安全基石
经常在网上看到某某公司几千万的个人敏感信息被泄露,这要是放在持牌的支付公司,可能就是一个非常大的麻烦,不但会失去用户的信任,而且可能会被吊销牌照。而现实情况是很多公司的技术研发人员并没有足够深的安全架构经验来设计一套…...
新概念英语第二册(58)
【New words and expressions】生词和短语(16) blessing n. 福分,福气 disguise n. 伪装 tiny adj. 极小的 possess v. 拥有 cursed …...
java和javascript的区别和联系
Java和JavaScript是两种非常流行的编程语言,尽管它们的名称相似,但实际上它们在设计、用途和运行环境等方面有很大的不同。以下是Java和JavaScript之间的主要区别和联系: 区别 设计目的和用途: Java 是一种通用的、面向对象的编程…...

uniapp中配置开发环境和生产环境
uniapp在开发的时候,可以配置多种环境,用于自动切换IP地址,用HBuilder X直接运行的就是开发环境,用HBuilder X发布出来的,就是生产环境。 1.使用HBuilder X创建原生的uniapp程序 选择vue3 2.什么都不改,就…...
prometheus之mysqld_exporter部署
mysql_exporter部署 下载解压压缩包 mkdir /opt/mysqld_exporter/ cd /opt/mysqld_exporter/ # 修改为自己的软件下载地址 wget http://soft.download/soft/linux/prometheus/mysqld_exporter/mysqld_exporter-0.14.0.linux-amd64.tar.gz tar -zxvf mysqld_exporter-0.14.0.…...
<网络安全>《19 安全态势感知与管理平台》
1 概念 安全态势感知与管理平台融合大数据和机器学习技术,提供可落地的安全保障能力,集安全可视化、监测、预警和响应处置于一体。它集中收集并存储客户I环境的资产、运行状态、漏洞、安全配置、日志、流量等安全相关数据,内置大数据存储和多…...

sqli靶场完结篇!!!!
靶场,靶场,一个靶场打一天,又是和waf斗智斗勇的一天,waf我和你拼啦!! 31.多个)号 先是一套基本的判断 ,发现是字符型,然后发现好像他什么都不过滤?于是开始poc 3213131…...

堆结构的解读
对于数据结构堆来说,堆事一种特定的数据结构,其与二叉树非常类似,但是又与二叉树有所不同,其不同点在于堆不需要左右指针指向孩子节点,而给定一个数组,将数组中的元素进行特定排序之后,就可以得…...
7、Qt5开发及实列(笔记)
文章目录 第二章 Qt5模板库、工具类及控件2.2 容器类2.2.1 QList类 # 2.3 QVariant类 #2.4 算法及正则表达式2.5控件 第二章 Qt5模板库、工具类及控件 2.2 容器类 2.2.1 QList类 //2.2容器类 - QList类QList<QString> list;//声明了一个QList<QString>栈对象{QSt…...

FPGA_ip_Rom
一 理论 Rom存储类ip核,Rom是只读存储器的简称,是一种只能读出事先存储数据的固态半导体存储器。 特性: 一旦储存资料,就无法再将之改变或者删除,且资料不会因为电源关闭而消失。 单端口Rom: 双端口rom: 二 Rom ip核…...

5-3、S曲线生成器【51单片机+L298N步进电机系列教程】
↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍步进电机S曲线生成器的计算以及使用 一.计算原理 根据上一节内容,已经计算了一条任意S曲线的函数。在步进电机S曲线加减速的控制中,需要的S曲线如图1所示,横…...
Google开源项目风格指南——Java
Google Java Style Guide 谷歌 Java 风格指南 谷歌 Java 风格指南1 简介1.1 术语说明1.2 指导说明 2 源文件基础知识2.1 文件名2.2 文件编码:UTF-82.3 特殊字符2.3.1 空白字符2.3.2 特殊转义序列2.3.3 非ASCII字符 3 源文件结构3.1 许可或版权信息(如果存…...
数字图像处理与Python语言实现-常见图像特效(二)
文章目录 9、Splash滤镜10、双色调(Duo-Tone)滤镜11、日光(Daylight)滤镜12、60sTVs效果13、高对比度14、棕褐色/复古滤镜15、晕影效果16、模糊滤镜17、浮雕边缘9、Splash滤镜 在Splash滤镜中,仅某些颜色保持原样,其余颜色转换为灰度。 为了执行此操作,我们将在 HSV 颜…...
学习方法分享
工作上的代码实现,不要过度设计,不要想着炫技,要简单务实,“大道至简”。 学习一个方向(模块化)的知识,不经意间就会涉及到另一个领域,比如从消息队列存储的顺序读/写,延…...

Python学习路线 - Python高阶技巧 - 拓展
Python学习路线 - Python高阶技巧 - 拓展 闭包闭包注意事项 装饰器装饰器的一般写法(闭包写法)装饰器的语法糖写法 设计模式单例模式工厂模式 多线程进程、线程并行执行多线程编程threading模块 网络编程Socket客户端和服务端Socket服务端编程实现服务端并结合客户端进行测试 S…...
qt在pro文件中设置utf-8编码
在 Qt 的 .pro 文件中设置使用 UTF-8 编码,可以通过在 .pro 文件中添加以下内容来实现: QMAKE_CXXFLAGS -source-charset UTF-8 QMAKE_CXXFLAGS -execution-charset UTF-8这样设置后,Qt 会将源代码和执行时的字符集都设置为 UTF-8 编码。这…...

如何在 emacs 上开始使用 Tree-Sitter(windows)
文章目录 如何在emacs上开始使用Tree-Sitter(windows) 如何在emacs上开始使用Tree-Sitter(windows) 参考:“How to Get Started with Tree-Sitter”。 首先要有一个可运行的emacs,并且它支持Tree-Sitter&…...
Qt 数据库操作V1.0
1、pro文件 QT sql2、h文件 #ifndef DATABASEOPERATION_H #define DATABASEOPERATION_H#include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QSqlRecord> #include <QDebug> #include <QVariant>clas…...
【Eclipse插件开发】3工作台workbench探索【上篇】
3工作台workbench探索 文章目录 3工作台workbench探索前言视图编辑器一、工作台Workbench入门工作台页透视图视图和编辑器二、使用命令的基本工作台扩展点2.1 org.eclipse.ui.views2.2 org.eclipse.ui.editors编辑器和内容大纲2.3 org.eclipse.ui.comm...
201912CSPT5魔数
题意:有一个从 1 1 1到 n n n的连续序列,有 q q q次查询,对区间操作 [ l , r ] [l,r] [l,r]: 1. 输出 s f ( A l ) f ( A l 1 ) . . . f ( A r ) , f ( x ) ( x 1.输出sf(A_l)f(A_{l1})...f(A_r),f(x)(x 1.输出sf(Al)f(Al1)...f(A…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...