在软件行业中,加解密技术广泛应用于数据保护、通信安全、身份验证等多个领域。加密(Encryption)是将明文数据转换为密文的过程,而解密(Decryption)则是将密文恢复为明文的过程。以下是加解密在软件行业中一些常见的应用和技术:
哈希函数将输入数据映射为固定长度的输出,广泛用于数据完整性校验和密码存储。常见哈希算法有 SHA(安全哈希算法)、MD5(尽管已不再推荐用于安全用途)等。
数字签名是基于非对称加密的技术,用于证明消息的来源和完整性。发送方使用私钥对消息生成签名,接收方使用公钥验证签名的真实性。
证书用于证明公钥的身份,公钥基础设施(PKI)管理公钥和证书的分发、撤销等过程。SSL/TLS协议使用数字证书保障网站与用户之间的安全通信。
在软件开发中,常用的加解密库有:
JCE
(Java Cryptography Extension)、BouncyCastle等。System.Security.Cryptography
库,BouncyCastle.NET等。pycryptodome
、cryptography
库等。#加解密在软件行业中起到了保护数据、确保通信安全、验证身份等重要作用,是现代计算机安全的基石。
对称加密和非对称加密是两种常见的加密技术,它们在加密和解密过程中有不同的密钥使用方式。下面是对这两种加密方式的详细介绍:
对称加密是指在加密和解密过程中使用相同的密钥。加密和解密操作的密钥是相同的,因此对称加密的安全性依赖于密钥的保密性。由于加密和解密操作都使用同一个密钥,因此对称加密算法的执行速度较快。
非对称加密又称公钥加密,它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。公钥和私钥是配对的,但从公钥无法推算出私钥。因此,非对称加密的安全性更高,因为即使公钥公开,私钥仍然是保密的。
特性 | 对称加密 | 非对称加密 |
---|---|---|
密钥 | 加密和解密使用相同的密钥。 | 加密使用公钥,解密使用私钥。 |
加解密速度 | 较快,适合加密大量数据。 | 较慢,适合加密少量数据或密钥交换。 |
密钥管理 | 需要安全地传输和存储密钥。 | 公钥可以公开,私钥保密。 |
安全性 | 如果密钥被泄露,安全性会受到威胁。 | 即使公钥公开,只要私钥保密,安全性较高。 |
应用场景 | 文件加密、数据库加密、磁盘加密等。 | 数字签名、SSL/TLS、电子邮件加密等。 |
常见算法 | AES、DES、RC4等。 | RSA、ECC、ElGamal等。 |
在现代加密系统中,通常会将对称加密和非对称加密结合使用,以便在不同场景下发挥各自的优势。例如,在SSL/TLS协议中:
这种组合方式能够同时解决密钥交换安全性和数据加密效率的问题。
笔者在自己的博客中写过关于这个的博客,地址为:
对称加密算法的使用Java和C#_java和c# 使用对称加解密-CSDN博客
非对称加密算法的使用_非对称加密秘钥使用-CSDN博客
哈希算法(Hash Algorithm)是将任意长度的输入(消息或数据)通过一种数学函数转化为固定长度输出的算法。该输出通常称为“哈希值”或“摘要”。哈希算法具有以下几个重要的特性:
哈希算法在计算机科学和安全领域有广泛的应用:
SHA是美国国家安全局(NSA)设计的一系列哈希算法,常用于数字签名和信息认证等领域。SHA算法有多个变种,常见的有:
在许多系统中,用户的密码不会直接存储在数据库中,而是存储其哈希值。当用户登录时,系统将输入的密码进行哈希处理,并与数据库中的哈希值进行比较。如果匹配,则认为密码正确。常用的哈希算法有:
哈希值可以用于校验文件是否被篡改。常见的应用场景是下载文件后检查文件的哈希值,以确保下载的文件未被修改。例如:
在数字签名中,首先对数据或消息计算哈希值,再使用私钥对该哈希值进行加密(签名)。接收方用公钥解密签名,并重新计算哈希值,验证数据的完整性和签名的有效性。
区块链技术中,每个区块包含上一个区块的哈希值,这样可以确保区块链中的数据不可篡改。比特币使用SHA-256算法进行区块哈希。
哈希算法的安全性主要体现在以下几个方面:
随着计算机技术的发展,较老的哈希算法(如MD5和SHA-1)已经不再满足现代安全要求,因此推荐使用更强的哈希算法,如SHA-256、SHA-3等。
算法 | 输出长度 | 安全性 | 计算速度 | 使用场景 |
---|---|---|---|---|
MD5 | 128位 | 不安全,易碰撞 | 快 | 文件校验、数字签名(不推荐用于安全敏感场合) |
SHA-1 | 160位 | 不安全,易碰撞 | 中 | 以前用于数字签名、SSL(已被弃用) |
SHA-256 | 256位 | 安全 | 中 | 区块链、SSL/TLS、数字签名等 |
SHA-512 | 512位 | 安全 | 慢 | 大型数据验证、数字签名等 |
Blake2 | 可配置 | 安全 | 快 | 密码哈希、文件验证等 |
RIPEMD-160 | 160位 | 安全 | 中 | 数字签名等 |
#总的来说,哈希算法是保证数据完整性和安全性的核心技术之一。它广泛应用于文件校验、数字签名、密码存储等多个领域,是现代信息安全体系的基础。
数字签名与验证是现代信息安全中的重要技术,广泛应用于确保数据的完整性、身份的真实性和不可否认性。数字签名用于证明某个消息的发送者是合法的,并确保消息在传输过程中没有被篡改。验证过程则是接收方检查消息和签名是否合法的过程。
数字签名是一种用于验证消息真实性、完整性和来源的技术,通常使用公钥加密技术。它通过发送方的私钥对消息(或消息的哈希值)进行签名,接收方可以使用发送方的公钥进行验证,确认消息的合法性和完整性。
哈希算法将消息映射到固定长度的哈希值。常用的哈希算法有SHA-256、SHA-512等。使用哈希算法可以有效地减少消息长度,提高签名和验证过程的效率。
私钥加密是对消息哈希值进行加密,生成数字签名。私钥是保密的,只有发送者知道。
接收方使用公钥解密数字签名,得到消息的哈希值。公钥是公开的,任何人都可以用来验证签名。
接收方对消息内容计算出哈希值,并与解密后的哈希值进行比较。如果一致,则签名验证通过。
常用的数字签名算法有以下几种:
M
应用哈希函数(例如SHA-256),生成哈希值H(M)
。private_key
对H(M)
进行加密,生成数字签名S
。M
和签名S
一同发送给接收方。M
和签名S
。M
应用相同的哈希算法(例如SHA-256),生成哈希值H'(M)
。public_key
解密签名S
,得到H(M)
。H'(M)
和H(M)
,如果相等,则说明签名有效,消息未被篡改;否则,签名无效。特性 | 加密 | 数字签名 |
---|---|---|
主要目的 | 保证消息内容的机密性 | 保证消息的完整性、身份认证和不可否认性 |
操作对象 | 加密原始消息 | 对消息的哈希值进行签名 |
加解密方式 | 使用公钥加密、私钥解密或私钥加密、公钥解密 | 使用私钥签名、公钥验证签名 |
应用场景 | 保密通信、保护数据隐私 | 数据完整性校验、身份认证、签署合同等 |
数字签名的安全性依赖于私钥的保密性。如果私钥被泄露,攻击者可以伪造签名,冒充合法的发送方。为了提高安全性,数字签名系统通常使用较强的加密算法(如RSA、ECDSA等),并结合多因素认证和密钥管理系统来保护私钥。
#数字签名技术在信息安全中具有至关重要的作用。它通过加密消息的哈希值并附加在消息上,确保消息的完整性、身份验证和不可否认性。数字签名与公钥加密技术紧密结合,并广泛应用于电子邮件、区块链、软件发布、电子合同等多个领域。
证书和公钥基础设施(PKK)是现代网络安全中的关键组成部分,广泛应用于身份验证、加密、数字签名和数据完整性保护。PKI为管理数字证书、密钥对及其相关的安全服务提供了框架,确保了通信双方的身份验证和加密过程的安全性。
公钥基础设施(PKI,Public Key Infrastructure)是一个用于管理密钥对(公钥和私钥)、数字证书以及相关安全服务的体系结构。PKI的核心目的是提供安全通信,包括数据加密、数字签名、身份验证、密钥管理等功能。PKI通过使用公钥加密算法来确保通信的安全性和数据的完整性。
PKI通常包括以下几个关键组件:
公钥和私钥是成对存在的,私钥加密的内容只有对应的公钥能够解密,反之亦然。
数字证书是由可信的第三方机构(证书颁发机构,CA)签发的,用于绑定公钥与公钥持有者的身份信息。数字证书通常包含以下内容:
数字证书是公钥的"身份证",其作用是确保通信中的身份真实性。
证书颁发机构(CA)是一个可信的第三方机构,负责签发、管理和吊销数字证书。CA验证申请者的身份并为其签发证书。证书的签发过程中,CA对申请者的身份进行验证,以确保其公钥对应的身份是合法的。
CA的主要职责包括:
注册机构(RA)是CA的辅助机构,负责在证书申请过程中进行身份验证,帮助CA完成证书的颁发。RA负责收集证书请求者的信息,并将其传送给CA进行签发,CA之后会基于RA的验证信息签发证书。
证书撤销列表是一个由CA发布的列表,包含被吊销的证书的序列号。当证书被认为不再有效(例如证书到期、密钥泄露或其他安全原因)时,CA会将证书加入CRL,以便用户能够检查证书是否有效。
PKI还包括密钥的生成、存储和管理功能。密钥必须得到妥善保护,防止私钥泄露。常见的密钥存储技术包括硬件安全模块(HSM)和软件密钥库。
数字证书的作用是将持有者的身份与公钥相绑定,并且通过数字签名确保证书的合法性。下面是数字证书如何工作的基本流程:
申请证书:
证书签发:
使用证书:
证书撤销:
PKI广泛应用于以下几种场景:
由于PKI的核心是信任模型,证书的安全性直接影响到整个系统的安全。CA作为信任链的核心,必须采取高度安全的措施来保护其私钥和证书系统的完整性。以下是一些安全措施:
尽管PKI提供了强大的安全性,但它也面临一些挑战:
#公钥基础设施(PKI)通过提供数字证书和密钥管理的机制,保证了数字通信的安全性和身份验证的可靠性。PKI的核心是证书、证书颁发机构(CA)和密钥管理,它广泛应用于加密通信、数字签名、身份认证等场景,保障了现代网络安全的基本需求。随着技术的不断发展,PKI系统在保证安全性和可扩展性方面仍然需要不断改进。
加密协议是指通过应用加密算法和技术,实现数据的加密、身份认证、完整性验证和不可否认性等功能的协议。加密协议在网络通信中起着至关重要的作用,确保数据的安全性,防止数据在传输过程中被泄露、篡改或伪造。
加密协议的设计通常涉及以下几个主要目标:
数据机密性(Confidentiality)
确保信息在传输过程中的内容无法被第三方查看。通过加密算法,只有授权方(如接收者)可以解密和查看数据内容。
数据完整性(Integrity)
确保数据在传输过程中没有被篡改。加密协议通常会使用哈希算法来检查数据是否被修改。
身份认证(Authentication)
确保通信双方的身份是合法的。例如,发送方可以通过数字签名或证书验证其身份,接收方可以确保发送方是其声称的实体。
不可否认性(Non-repudiation)
防止通信方在传输数据后否认自己曾经发送或接收过某条消息。数字签名是实现不可否认性的常用方法。
密钥交换(Key Exchange)
确保通信双方能够安全地交换加密密钥,以便后续使用对称加密加密数据。密钥交换过程必须是安全的,即便在不安全的信道中也能保护密钥的机密性。
SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是最广泛应用于网络通信的加密协议,主要用于保护Web浏览器与服务器之间的通信。TLS是SSL的后续版本,SSL在大部分应用中已经被TLS取代。
工作原理:
应用场景:
SSL/TLS广泛用于HTTPS(安全的HTTP)、电子邮件(如IMAPS、POP3S、SMTPS)等安全通信协议,保障数据的机密性和完整性。
安全特性:
IPSec是一种用于Internet Protocol(IP)层的加密协议,主要用于保护IP通信的安全性。IPSec可以保护通过IP协议发送的所有数据包,包括数据包的头部和数据内容。
工作原理:
IPSec通过两种模式实现加密:
应用场景:
IPSec广泛应用于VPN(如远程访问VPN和站点到站点VPN),确保互联网中的数据通信安全。
安全特性:
SSH(Secure Shell)是一种用于远程登录计算机并执行命令的协议,它使用加密技术保护数据传输过程中的机密性和完整性。SSH用于保护与远程服务器的连接,防止远程会话被窃听或篡改。
工作原理:
应用场景:
SSH常用于远程管理服务器、传输敏感文件和执行远程命令等操作。
安全特性:
Kerberos是一个计算机网络认证协议,旨在通过密钥分配中心(KDC)提供安全的身份验证和通信保护。它广泛用于局域网中,尤其是在微软的Active Directory环境中。
工作原理:
应用场景:
Kerberos通常用于公司或组织内部的身份认证,广泛应用于Windows域控制器、LDAP、网络文件系统(NFS)等。
安全特性:
OAuth是一个开放标准,允许用户授权第三方应用访问其在其他网站上存储的资源而无需暴露密码。OAuth广泛应用于社交登录、API访问控制等场景。
工作原理:
应用场景:
OAuth广泛用于社交媒体的单点登录(SSO)和API认证(如Google、Facebook登录)。
安全特性:
加密协议的安全性依赖于多个因素,包括:
随着技术的不断发展,尤其是量子计算的进步,传统的加密协议面临一些新的挑战:
#加密协议在网络安全中起着至关重要的作用,它们通过加密技术、身份验证和完整性保护来确保通信的机密性、安全性和可信性。常见的加密协议如SSL/TLS、IPSec、SSH、Kerberos和OAuth等都在不同的场景中得到了广泛应用。随着新的技术发展,特别
数据加密在实际应用中扮演着至关重要的角色,它广泛应用于各种场景中,以确保数据的机密性、完整性和身份认证。以下是一些典型的应用场景,展示了数据加密如何在不同领域和技术中实现安全保护。
#数据加密在实际应用中极为广泛,不仅仅限于保护网络通信,还涵盖了存储、身份验证、云服务、区块链等多个领域。加密技术通过确保数据的机密性、完整性和身份验证,保障了个人、企业和政府组织的安全。在未来,随着数据
隐私和安全需求的不断提高,数据加密将继续在多个场景中发挥着重要作用。
加解密技术在提供数据安全性方面发挥着重要作用,但在实际应用中面临诸多挑战。随着技术发展、攻击手段的更新,以及应用场景的复杂化,加解密技术需要不断适应新的需求。以下是加解密技术面临的一些主要挑战:
量子计算的快速发展对传统加解密算法(如RSA、ECC等)构成了潜在威胁。量子计算能够通过Shor算法有效地破解这些公钥加密算法,从而使当前广泛使用的加解密技术面临被破解的风险。
加密强度(即加密算法的复杂性)与加解密效率(处理速度)之间通常存在一个平衡点。加强加密强度往往意味着更高的计算开销和处理延迟,这在高并发、高性能应用中是一个挑战。
随着加密算法的不断发展,新的加密标准和协议层出不穷。这可能导致不同系统之间出现兼容性问题,尤其是当旧的加密协议(如SSL 3.0、TLS 1.0)不再安全时,系统需要迁移到新的协议版本。这对于维护大规模系统和跨平台通信至关重要。
加密系统在防止数据篡改和伪造方面有着广泛应用。例如,在传输过程中,数据可能会被篡改或伪造,进而影响系统的可靠性和安全性。传统的加解密算法未必能够完全防止此类攻击。
加解密技术虽然能确保系统的技术安全,但人类因素往往是安全系统的薄弱环节。攻击者可能通过社交工程学手段获取密钥或密码,或通过内部人员的失误泄露加密信息。
#加解密技术在确保数据安全性方面至关重要,但在实际应用中也面临许多挑战。这些挑战不仅仅涉及算法的设计和实现,还包括密钥管理、性能优化、量子计算威胁以及用户操作等多个方面。为了解决这些挑战,相关领域的技术人员和研究人员需要不断探索新的加密方案、算法优化和安全实践,以应对日益复杂的安全威胁。
国密SM2验签算法浅谈 - 知乎
国密算法(SM算法)是中国自主研发的加密算法,旨在提供国内外安全通信标准化的技术支持,特别是为了应对国家信息安全的需求。SM算法包括对称加密算法、非对称加密算法、哈希算法以及数字签名算法,它们被广泛应用于政府、金融、通信等领域。
以下是国密算法的主要组成部分:
SM1是中国自主研发的一种对称加密算法,类似于AES(高级加密标准)。SM1算法的设计目标是实现高效且安全的加密,在多种环境下提供可靠的数据保护。
SM2是中国的椭圆曲线公钥密码算法,用于数字签名和公钥加密。它的设计受到国际上椭圆曲线加密(ECC)算法的影响,具有较高的安全性与效率。
SM3是中国国家密码管理局发布的加密哈希函数,类似于SHA-256,用于生成消息的摘要(或称“哈希值”)。它广泛用于数据完整性校验、数字签名、消息认证等场景。
SM4是中国的对称加密算法,广泛应用于信息安全领域,特别是在金融、政府以及电力等行业。SM4是中国政府规定的商用加密算法,旨在替代一些国际标准(如AES)。
SM9是一种基于身份的公钥加密算法,通常用于身份认证和保护隐私。它结合了椭圆曲线密码学(ECC)和身份基加密的概念,是中国自主研发的用于现代信息安全的创新算法之一。
国密算法(SM算法)在中国信息安全体系中占据着重要地位,广泛应用于金融、政府、通信等多个领域,尤其是在保障数据安全、隐私保护和信息传输的过程中发挥了重要作用。以下是国密算法的主要应用场景:
金融行业对信息安全的要求极高,尤其是在电子支付、网上银行、金融交易等过程中,需要确保交易数据、用户信息和资金安全。国密算法为金融领域提供了高效、安全的加密技术保障。
政府部门在进行电子政务、数字化办公和公共服务的过程中,需要处理大量敏感的个人数据、政府文件和业务数据。因此,信息的保密性、完整性和身份认证至关重要。
在通信和网络服务中,确保数据的安全性、传输的保密性、通信的身份验证和完整性是至关重要的。国密算法在此领域的应用,能够防止数据在传输过程中被窃取或篡改。
随着信息化进程的加快,智能卡、身份证、社保卡等数字身份认证工具逐渐普及,涉及到广泛的个人信息安全问题。国密算法在此类应用中提供了身份验证、数据加密和信息安全保障。
企业在进行内部数据交换、文件存储和传输时,特别是涉及商业机密和敏感信息的场合,需要确保数据的安全性与完整性。国密算法为企业信息安全提供了强有力的技术支持。
电子商务平台和电子交易系统需要在开放的网络环境中保障交易过程的安全性,防止信息泄露、篡改或伪造。国密算法在此类场景下用于保护交易信息和支付安全。
物联网设备中涉及大量的传感器、通信设备以及自动化控制系统,数据的安全传输和设备身份验证尤为重要。国密算法可以有效保障物联网环境中的数据安全和设备通信安全。
随着云计算和大数据技术的普及,越来越多的企业和个人将数据存储和处理转移到云平台。如何保证云中的数据安全和隐私成为一个关键问题。国密算法在云计算环境中用于保护数据的加密和访问控制。
#国密算法(SM算法)作为中国自主研发的加密标准,在多个领域得到广泛应用,尤其是在金融、政府、通信、企业信息安全等方面,提供了强有力的技术保障。随着信息安全需求的不断增长和国内外加密技术的不断发展,国密算法将在未来继续发挥重要作用。
国密算法在设计时不仅参考了国际加密标准(如AES、RSA、SHA等),而且也具有一些中国特有的设计和规范。尽管SM算法的安全性和效率在国内有较强的保证,但在国际化应用上,由于不同国家和地区对于加密技术的标准化差异,国密算法可能需要在兼容性和互操作性上做一些适应工作。
国密算法(SM算法)与国际标准之间存在一定的相似性和差异性,主要体现在设计理念、算法实现、应用场景等方面。尽管国密算法参考了许多国际标准,如AES(高级加密标准)、RSA(非对称加密)、SHA(安全哈希算法)等,但它们也具有一些独特的设计特征,以适应中国的信息安全需求。
随着全球信息安全和加密技术的不断发展,国密算法逐渐朝着与国际标准接轨的方向发展。以下是国密算法与国际标准在某些领域的协同与兼容情况:
#国密算法与国际标准在加密原理、应用领域和标准化进程上具有相似性和差异性。虽然国密算法在设计时参考了国际标准,并且在技术上具有一定的兼容性,但由于其独特的设计和对国内法规的适应,国密算法仍然主要应用于中国境内,并且在国际化、互操作性方面面临挑战。随着全球信息安全的不断演进,国密算法与国际标准的协同和兼容性将成为未来发展的重要方向。
#国密算法(SM算法)是中国自主研发并标准化的加密技术,涵盖了对称加密、非对称加密、哈希、数字签名等多种技术。它不仅满足了国内对于信息安全的需求,还在金融、政府、通信等多个领域得到广泛应用。随着国家对信息安全的重视,国密算法的影响力在国内不断增强,但在国际应用中可能面临与国际标准兼容的问题。
在软件开发中,涉及密码学、加解密的场景广泛,特别是在需要保障数据机密性、完整性、身份验证和防篡改的场合。以下是一些常见的与加解密相关的场景:
#在软件开发中,加解密技术的应用涉及从数据存储到网络通信,再到身份验证、支付交易和文件保护等多个领域。这些加解密场景通常基于对称加密、非对称加密、哈希算法和数字签名等密码学原理,为信息系统提供机密性、完整性、身份验证和防篡改的保障。
在加解密过程中,可能会遇到以下几种问题:
#加解密技术虽然能够有效提高数据的安全性,但在实际应用中也会产生一些问题。开发人员需要注意性能优化、密钥管理、算法选择、合规性要求、加密模式和网络环境等方面的挑战,并采取相应的措施来应对这些问题。例如,合理选择加密算法、采用高效的密钥管理方案、确保加密配置的正确性、增强系统的容错能力等,都是应对加解密相关问题的重要手段。
模糊查询是指在查询过程中,不要求查询条件完全匹配数据,而是允许部分匹配(例如,查询含有特定子串的文本数据)。模糊查询常见的应用场景包括数据库中的“LIKE”查询、搜索引擎的关键字搜索等。然而,模糊查询与加密数据结合时会遇到一些问题,因为加密后的数据通常是不可预测的,不能直接进行模糊查询。
要在加密数据上实现模糊查询,可以使用以下几种技术:
可搜索加密(Searchable Encryption,SE)是一种支持在加密数据上进行搜索的技术,允许用户在不解密的情况下查询密文数据。可搜索加密可以用于支持模糊查询,但这通常需要一些额外的支持和实现。
对称可搜索加密(Symmetric Searchable Encryption,SSE):基于对称加密的搜索方案,可以在加密数据中执行关键词匹配。对于模糊查询,SSE算法通常会通过特殊的加密和索引方式来允许部分匹配操作。
公钥可搜索加密(Public-key Searchable Encryption,PEKS):基于公钥加密的一种搜索方案,可以通过加密的查询来搜索存储在云端的加密数据。对模糊查询的支持可能需要特殊的加密算法。
同态加密允许在加密数据上进行某些数学操作,但通常不直接支持模糊查询。因为模糊查询的本质是基于字符串或模式的比较,而同态加密主要适用于数值计算(例如加法、乘法)。
不过,有些研究探索了同态加密与模糊查询结合的可能性。通过将字符串转化为数值,进行特定的同态加密计算,理论上可以在加密数据上进行模糊查询,但这种方法的计算开销非常大,且技术实现较为复杂。
对于需要进行模糊查询的场景,可以通过建立加密索引和使用分词技术来间接支持模糊查询。一般的做法是:
当用户进行查询时,可以通过加密的分词索引来查找匹配的项,模拟模糊查询的行为。
加密代理可以通过将加密数据转发给可信的代理来执行某些预定义的查询操作。在某些情况下,代理可以通过将数据解密后处理查询,再返回加密的结果。虽然这种方法可能不直接支持模糊查询,但可以通过代理系统提供的查询功能实现间接的模糊查询。
布隆过滤器是一种空间效率极高的概率型数据结构,可以用于快速检查某个元素是否存在于一个集合中。对于模糊查询的场景,可以将查询条件(如关键词)转换为哈希值,并利用布隆过滤器进行快速匹配。
#模糊查询在加密数据上实现时,面临着较大的挑战,尤其是在保证数据隐私和安全性的同时,还能高效地进行模糊匹配。可搜索加密技术是最常用的方案之一,但在实际应用中,模糊查询的支持有限,且性能较低。对于更高效的模糊查询,通常需要使用加密索引、分词处理或布隆过滤器等辅助技术。
#因此,在实现加密数据上的模糊查询时,需要在隐私保护、性能和技术实现之间做出权衡。
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.8.16version>
dependency>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-cryptoartifactId>
<version>5.8.16version>
dependency>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-coreartifactId>
<version>5.8.16version>
dependency>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-cryptoartifactId>
<version>5.8.16version>
dependency>
package encryptiondecryption;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.crypto.digest.Digester;
import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.DES;
import org.bouncycastle.util.encoders.Hex;
import java.nio.charset.StandardCharsets;
import static com.sun.xml.internal.ws.policy.sourcemodel.wspolicy.XmlToken.DigestAlgorithm;
public class EncryDecryDemo {
public static void main(String[] args) {
runDemo();
}
public static void runDemo() {
System.out.println("Hutool包实现...........");
AESExample();
System.out.println("------------------------------------------------");
DESExample();
System.out.println("------------------------------------------------");
RSAExample();
System.out.println("------------------------------------------------");
HMACExample();
System.out.println("------------------------------------------------");
MD5Demo();
System.out.println("------------------------------------------------");
SHADemo();
}
private final static String key = "1234567812345678";
private final static String content = "Hello, Hutool!";
private static void AESExample() {
System.out.println("----------------------AESExample----------------------");
// 密钥
AES aes = SecureUtil.aes(key.getBytes());
// 加密
byte[] encrypted = aes.encrypt(content);
System.out.println("Encrypted (Hex): " + Hex.toHexString(encrypted));
// 解密
String decrypted = aes.decryptStr(encrypted);
System.out.println("Decrypted: " + decrypted);
}
private static void DESExample() {
System.out.println("----------------------DESExample----------------------");
DES des = SecureUtil.des(key.getBytes());
// 加密
byte[] encrypted = des.encrypt(content);
System.out.println("Encrypted (Hex): " + Hex.toHexString(encrypted));
// 解密
String decrypted = des.decryptStr(encrypted);
System.out.println("Decrypted: " + decrypted);
}
private static void RSAExample() {
System.out.println("----------------------RSAExample----------------------");
// 生成 RSA 密钥对
RSA rsa = new RSA();
// 获取公钥和私钥
String publicKey = rsa.getPublicKeyBase64();
String privateKey = rsa.getPrivateKeyBase64();
// 显示公私钥
System.out.println("Public Key: " + publicKey);
System.out.println("Private Key: " + privateKey);
// 使用公钥加密
String encryptedData = rsa.encryptBase64(content, KeyType.PublicKey);
System.out.println("Encrypted Data: " + encryptedData);
// 使用私钥解密
String decryptedData = rsa.decryptStr(encryptedData, KeyType.PrivateKey);
System.out.println("Decrypted Data: " + decryptedData);
}
private static void HMACExample() {
System.out.println("----------------------HMACExample----------------------");
HMac hmac = SecureUtil.hmacMd5(key.getBytes());
// 原始数据
byte[] hash = hmac.digest(content);
System.out.println("HMAC: " + Hex.toHexString(hash));
}
private static void MD5Demo(){
System.out.println("----------------------MD5Demo----------------------");
// 使用 Hutool 计算 MD5 哈希
String md5Hex = DigestUtil.md5Hex(content);
System.out.println("MD5 Hash (Hex): " + md5Hex);
// 如果需要使用字节数组的 MD5 byte[] md5Bytes = DigestUtil.md5(content.getBytes(StandardCharsets.UTF_8));
System.out.println("MD5 Hash (Bytes): " + bytesToHex(md5Bytes));
}
private static void SHADemo(){
System.out.println("----------------------SHADemo----------------------");
// 使用 Hutool 计算 SHA-1 哈希
String sha1Hex = DigestUtil.sha1Hex(content);
System.out.println("SHA-1 Hash (Hex): " + sha1Hex);
// 使用 Hutool 计算 SHA-256 哈希
String sha256Hex = DigestUtil.sha256Hex(content);
System.out.println("SHA-256 Hash (Hex): " + sha256Hex);
// 使用 Hutool 计算 SHA-512 哈希
String sha512Hex = DigestUtil.sha512Hex(content);
System.out.println("SHA-512 Hash (Hex): " + sha512Hex);
// 如果需要使用字节数组的 SHA byte[] sha256Bytes = DigestUtil.sha256(content.getBytes(StandardCharsets.UTF_8));
System.out.println("SHA-256 Hash (Bytes): " + bytesToHex(sha256Bytes));
}
// 字节数组转十六进制字符串
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
Hutool包实现...........
----------------------AESExample----------------------
Encrypted (Hex): 18d8c30bd2781a9d4d7c38b0e5506a37
Decrypted: Hello, Hutool!
------------------------------------------------
----------------------DESExample----------------------
Encrypted (Hex): 7526c1eddf455bc61dfa0e81c00b2f11
Decrypted: Hello, Hutool!
------------------------------------------------
----------------------RSAExample----------------------
Public Key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmiJKUqUaaofrnQ22CFQ5D2Ffed9bR/VBFD+qtcz3XKcJk3XhN/1zH5jy+pWIB/iP8TgB51lctkXyOo1XDoxgR6+Mqmm0/l1znaeozk+vySHidvjYIERubftWJmI9NRNKGkxzKT7XFyoZmyRe02fIgOJV8guw1wIzw6QKsZF5/IQIDAQAB
Private Key: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKaIkpSpRpqh+udDbYIVDkPYV9531tH9UEUP6q1zPdcpwmTdeE3/XMfmPL6lYgH+I/xOAHnWVy2RfI6jVcOjGBHr4yqabT+XXOdp6jOT6/JIeJ2+NggRG5t+1YmYj01E0oaTHMpPtcXKhmbJF7TZ8iA4lXyC7DXAjPDpAqxkXn8hAgMBAAECgYAVeh+NVJdqceFt2eBRmm2QimIqqsHlqwmjHn5hiC89hIExiO5vALPyg9rpq2KMZz4018pv7BiqI80wiBgTdwEveOMX9488yZ5pkQPwhgEGx8bE7VWyQ7x/4jBtCpqAivOpIP3lyOscztSjGiIamT00FCZZ2n0GH2Av4yyZgrLKEQJBAOfSx1vAYf1/StDJg+pUqqIGG8Yabe6CcT7p7UKr3t2p/UAD2RdyeVn38sUfxXSA5BCDoeDDulVGbtymtfV/UgcCQQC35q8/6TCv8KheFGcnLnUPE/xVE0EqBrNQwGG52trp4M90FL0ouldn6SO6JhKsFOAJtRwnGVG6zdw07msBVruXAkA5n1jSY5V3z0Ync4+IlZb8QwxwR21/1YiUnMzOv63b5z79xHcXruqfBFShzu3jsY3+1NlN5xjPzXwM+JtN9GHNAkEAty1ZfKCK9YUSP/u0r+tvgCBZJGi0bOcVr6ag8R5VFcbu/OI3dJz/uSoZgy6vRKbabfDvZOasaRTqdfLRtRiuawJBALDRACa3lUuFESCjZ+XhZI8iC53Q6sL7bcFKmY95FgWo8yoNd/Zdej/xG5NrnL2yQbDbiYfgDJYy/Ahcmsz3p2o=
Encrypted Data: GLLXaRtWMXpAKRSLU20iqTSlFbW2ZH1/XtyPTl6ASLv42DiIKKs+EdYGU9GhnJQUZD56vphl6wGBtvFsvWdJ+ajjRqU8Saxb+Le1CYXtJn7gA0PJ3nC+dWV/b8ZTQERbZ+Oha2GPqUdUyHPrMpYKXq2vIUcRu+N/FHnmTS0PnZA=
Decrypted Data: Hello, Hutool!
------------------------------------------------
----------------------HMACExample----------------------
HMAC: 295a32c11e9f7b5f58bf2ea2c0b83b41
------------------------------------------------
----------------------MD5Demo----------------------
MD5 Hash (Hex): 727a8ae5cb807f0bc9a29e696febf685
MD5 Hash (Bytes): 727a8ae5cb807f0bc9a29e696febf685
------------------------------------------------
----------------------SHADemo----------------------
SHA-1 Hash (Hex): c918717605c1280793ec9d718bd74d321ce11231
SHA-256 Hash (Hex): bcf07f54ed04354d491445b03a54cbeca3151f19af1bb700af3a1894cd673b83
SHA-512 Hash (Hex): bb823d6cae8d048c4707f156c4389867c0b4784e8faf4802bc76ea72d4c86c637853a47451ff7bd0771dd183c4336024ac619c4ab0b6ecdbbfd3c345529ec085
SHA-256 Hash (Bytes): bcf07f54ed04354d491445b03a54cbeca3151f19af1bb700af3a1894cd673b83
package encryptiondecryption;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.crypto.symmetric.SM4;
import org.bouncycastle.util.encoders.Hex;
public class SMDemo {
public static void main(String[] args) {
runDemo();
}
private static void runDemo() {
System.out.println("Hutool包实现...........");
SM2Demo();
System.out.println("------------------------------------------------");
SM4Demo();
System.out.println("------------------------------------------------");
SM2SignDemo();
System.out.println("------------------------------------------------");
}
private final static String content = "Hello, World!";
private static void SM2Demo(){
// SM2 密钥对生成
SM2 sm2 = new SM2();
// 获取公私钥
String publicKey = sm2.getPublicKeyBase64();
String privateKey = sm2.getPrivateKeyBase64();
System.out.println("Public Key: " + publicKey);
System.out.println("Private Key: " + privateKey);
// 数据加密
byte[] encrypted = sm2.encrypt(content.getBytes(), KeyType.PublicKey);
System.out.println("Encrypted: " + Hex.toHexString(encrypted));
// 数据解密
byte[] decrypted = sm2.decrypt(encrypted, KeyType.PrivateKey);
System.out.println("Decrypted: " + new String(decrypted));
}
private final static String key = "1234567812345678";
private static void SM4Demo(){
// 创建 SM4 加解密对象
SM4 sm4 = new SM4(key.getBytes());
// 加密
byte[] encrypted = sm4.encrypt(content.getBytes());
System.out.println("Encrypted (Hex): " + Hex.toHexString(encrypted));
// 解密
byte[] decrypted = sm4.decrypt(encrypted);
System.out.println("Decrypted: " + new String(decrypted));
}
private static void SM2SignDemo(){
// SM2 密钥对生成
SM2 sm2 = new SM2();
String privateKey = sm2.getPrivateKeyBase64();
String publicKey = sm2.getPublicKeyBase64();
System.out.println("privateKey: " + privateKey);
System.out.println("publicKey: " + publicKey);
// 使用私钥进行签名
byte[] sign = sm2.sign(content.getBytes(), privateKey.getBytes());
System.out.println("Signature: " + Hex.toHexString(sign));
// 使用公钥进行验证
boolean isValid = sm2.verify(content.getBytes(), sign, publicKey.getBytes());
System.out.println("Signature valid: " + isValid);
}
}
Hutool包实现...........
Public Key: MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAElg+qgDOksZUhWxoCUqtFesG0Lp/uES9H/+UYQawjPhxgmjmDt7D63kHB8ayg2AdDU72sc3KlWxeZUNcK2DOepQ==
Private Key: MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgQIIsdETvq1XCEnTrIqFq+RuuQZPbsb5EZVZyQuUdZL2gCgYIKoEcz1UBgi2hRANCAASWD6qAM6SxlSFbGgJSq0V6wbQun+4RL0f/5RhBrCM+HGCaOYO3sPreQcHxrKDYB0NTvaxzcqVbF5lQ1wrYM56l
Encrypted: 04004a8977e945dd95c4c6739e7e07d936009faf21a2e95de6610cbbc63898f1e867b7b5437df801419ca1d3e2e0136eecf16d2b2a6d28659c97c9aa03eac124fa95ad9731ed27f844a7764e32226e4053372b1f5f83df62fb8c686b49c458c43a3b8e09043e85b6edc2fb941922
Decrypted: Hello, World!
------------------------------------------------
Encrypted (Hex): 78ddd8cb6de13a2c6ef0686ca15af9d9
Decrypted: Hello, World!
------------------------------------------------
privateKey: MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgpWb1tMuRhKjqLc8B+XCC/rQW9GtmLsqqccXL3uXZJymgCgYIKoEcz1UBgi2hRANCAARsHf0E8WfMWX0h0ZhnvobJ9lq8oF4h+uT1BP55ScW10irYXlSojAtDRjh0dQeBa5gq/WuO56orEu4lBTj9ewCk
publicKey: MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEbB39BPFnzFl9IdGYZ76GyfZavKBeIfrk9QT+eUnFtdIq2F5UqIwLQ0Y4dHUHgWuYKv1rjueqKxLuJQU4/XsApA==
Signature: 3045022100f4beeabd1142ae26a3643b91931571123d75acc2cabeeda200b6ef9b4367c9970220769b40f56b4831c6364bfbc046b15ef592d8e9de47d53158a31af07ad91640bb
Signature valid: false
------------------------------------------------
在软件开发中,涉及加解密操作时,经常会使用一些特殊的技术和策略来提高安全性和防止常见攻击。以下是几个常见的特殊操作:
加盐是指在加密之前向密码或敏感数据添加一些随机数据(盐值)。这样即使两个用户的密码相同,经过加盐后的密码也会不同。常见的应用场景包括:
文件哈希是通过哈希算法(如SHA-256)将文件内容生成一个固定长度的字符串,用于验证文件的完整性或进行签名:
有些情况下,为了提高传输效率或存储节省,可能会在加密前对数据进行压缩,或者在加密之后对数据进行压缩。
混合加密是将对称加密和非对称加密结合使用的技术。通常,非对称加密用于加密对称加密的密钥,而对称加密则用于加密实际的数据。常见应用包括SSL/TLS等。