当前位置: 首页 > news >正文

一个专门做标题的网站wordpress全站静态cdn

一个专门做标题的网站,wordpress全站静态cdn,做英文网站 赚钱,wordpress4.7.0下载文章目录 什么是二要素如何保护二要素#xff08;姓名和身份证#xff09;加密算法分类场景选择算法选择AES - ECB 模式 (不推荐)AES - CBC 模式 (推荐)GCM#xff08;Galois/Counter Mode#xff09;AES-256-GCM简介AES-256-GCM工作原理安全优势 应用场景其他模式 和 敏感… 文章目录 什么是二要素如何保护二要素姓名和身份证加密算法分类场景选择算法选择AES - ECB 模式 (不推荐)AES - CBC 模式 (推荐)GCMGalois/Counter ModeAES-256-GCM简介AES-256-GCM工作原理安全优势 应用场景其他模式 和 敏感数据加密建议 Code 什么是二要素 二要素姓名和身份证是敏感数据很多网站仅仅依靠二要素来确认你是谁若以明文形式存储在数据库中存在被攻破的风险。若这些信息被不法分子获取 后果严重。 如何保护二要素姓名和身份证 单向散列算法如MD5、SHA-256等虽然可以对数据生成唯一的指纹但由于其不可逆无法用于加密需要解密的数据。因此它不适合用于对二要素信息如姓名和身份证进行加密保存。 在此情况下需要选择真正的加密算法来实现数据的加密存储与解密。 加密算法分类 对称加密算法 对称加密算法依赖于一个相同的密钥既用于加密也用于解密。常见的对称加密算法包括AES、DES、3DES等。在通信场景中加密方和解密方必须事先共享密钥双方才能进行加密和解密。密钥的共享过程是该加密方式的关键挑战之一因为如果密钥在传输过程中被窃取或泄露加密数据就容易被解密安全性将大打折扣。优点对称加密的主要优势在于加密和解密的速度非常快特别适合需要高效处理大量数据的场景。缺点密钥分发的安全性是对称加密的主要隐患。如果在通信中密钥传输不当导致泄露攻击者可以利用该密钥轻松解密数据。 非对称加密算法 非对称加密算法由一对密钥构成分别为公钥加密密钥和私钥解密密钥。常见的非对称加密算法有RSA、DSA等。公钥可以任意公开而私钥必须保持私密。使用公钥加密的数据只能由对应的私钥解密。因此通信双方只需共享公钥即可无需直接传输私钥从而避免了密钥泄露的问题。优点非对称加密解决了密钥分发的安全性问题适合用在双方未建立密钥共享机制的场景。缺点加密和解密的速度相对较慢特别是在处理大数据量时性能不足。 场景选择 在需要加密保存二要素信息的场景下加密和解密都是由同一个服务端程序执行双方并不需要通过网络传输密钥因此密钥分发的安全性问题不是关键点。相对而言对称加密算法具有速度快、效率高的优势更适合在服务端加密存储二要素数据。 因此尽管非对称加密在解决密钥传输安全性上有独特优势但在保存敏感数据的场景中采用对称加密算法如AES-CBC或AES-CTR模式更为合适。 算法选择 对称加密常用算法有 DES、3DES 和 AES。 DES 已被证明不安全破解时间很短不推荐使用。3DES 通过三次 DES 串联调用解决了 DES 的安全性问题但速度较慢也不推荐使用。AES 是目前公认安全且高效的算法采用 Rijndael 作为标准。 AES 是目前较为主流的对称加密算法兼具高安全性和高性能。AES 是由 NIST 选拔出的 Rijndael 算法作为标准支持分组加密模式。AES 每次处理 128 位明文生成相应的 128 位密文。对于较长的明文需要通过分组迭代加密。 AES - ECB 模式 (不推荐) 加密一段包含 16 个字符的字符串得到密文 A然后把这段字符串复制一份成为一个32 个字符的字符串再进行加密得到密文 B。我们验证下密文 B 是不是重复了一遍的密文 A。 模拟银行转账的场景假设整个数据由发送方账号、接收方账号、金额三个字段构成。我们尝试改变密文中数据的顺序来操纵明文 private static final String KEY secretkey1234567;GetMapping(ecb)public void ecb() throws Exception {Cipher cipher Cipher.getInstance(AES/ECB/NoPadding);test(cipher, null);}private static SecretKeySpec setKey(String secret) {return new SecretKeySpec(secret.getBytes(), AES);}private static void test(Cipher cipher, AlgorithmParameterSpec parameterSpec) throws Exception {cipher.init(Cipher.ENCRYPT_MODE, setKey(KEY), parameterSpec);System.out.println(一次 Hex.encodeHexString(cipher.doFinal(abcdefghijklmnop.getBytes())));System.out.println(两次 Hex.encodeHexString(cipher.doFinal(abcdefghijklmnopabcdefghijklmnop.getBytes())));byte[] sender 1000000000012345.getBytes();byte[] receiver 1000000000034567.getBytes();byte[] money 0000000010000000.getBytes();//加密发送方账号System.out.println(发送方账号 Hex.encodeHexString(cipher.doFinal(sender)));//加密接收方账号System.out.println(接收方账号 Hex.encodeHexString(cipher.doFinal(receiver)));//加密金额System.out.println(金额 Hex.encodeHexString(cipher.doFinal(money)));byte[] result cipher.doFinal(ByteUtils.concatAll(sender, receiver, money));//加密三个数据System.out.println(完整数据 Hex.encodeHexString(result));byte[] hack new byte[result.length];//把密文前两段交换System.arraycopy(result, 16, hack, 0, 16);System.arraycopy(result, 0, hack, 16, 16);System.arraycopy(result, 32, hack, 32, 16);cipher.init(Cipher.DECRYPT_MODE, setKey(KEY), parameterSpec);//尝试解密System.out.println(原始明文 new String(ByteUtils.concatAll(sender, receiver, money)));System.out.println(操纵密文 new String(cipher.doFinal(hack)));} 输出 一次a6025aaadd429e8c13073fc3512a7250 两次a6025aaadd429e8c13073fc3512a7250a6025aaadd429e8c13073fc3512a7250 发送方账号fdfc03515d95e2fa33edc9ca67cf43ae 接收方账号e70eecf4baa8decf117d294e12d850c0 金额f317ed23783f4babb607bd88ba076d0c 完整数据fdfc03515d95e2fa33edc9ca67cf43aee70eecf4baa8decf117d294e12d850c0f317ed23783f4babb607bd88ba076d0c 原始明文100000000001234510000000000345670000000010000000 操纵密文100000000003456710000000000123450000000010000000如上代码示例展示了 ECB 模式的漏洞攻击者可以在不解密的情况下操纵密文实现对敏感数据如银行转账信息的修改。 ----- 在不知道密钥的情况下我们操纵密文实现了对明文数据的修改对调了发送方账号和接收方账号 原始明文100000000001234510000000000345670000000010000000 操纵密文100000000003456710000000000123450000000010000000代码运行的结果证明了 重复的明文生成相同的密文。 攻击者可以通过调换密文分组的顺序达到修改明文数据的效果。 重复性问题如果明文中有重复的分组密文中也会出现重复这会暴露明文的模式存在规律性。 独立分组问题每个分组独立加密和解密攻击者可以通过交换密文分组的顺序来操控明文内容。 因此ECB 模式简单但不安全不推荐使用。 AES - CBC 模式 (推荐) CBC 模式在解密或解密之前引入了 XOR 运算第一个分组使用外部提供的初始化向量IV从第二个分组开始使用前一个分组的数据这样即使明文是一样的加密后的密文也是不同的并且分组的顺序不能任意调换。这就解决了 ECB 模式的缺陷. 把之前的代码修改为 CBC 模式再次进行测试 private static final String initVector abcdefghijklmnop;GetMapping(cbc)public void cbc() throws Exception {Cipher cipher Cipher.getInstance(AES/CBC/NoPadding);IvParameterSpec iv new IvParameterSpec(initVector.getBytes(UTF-8));test(cipher, iv);}可以看到相同的明文字符串复制一遍得到的密文并不是重复两个密文分组并且调换密文分组的顺序无法操纵明文。 一次6fa7a7b2c0979abecc1b59fe17b663c6 两次6fa7a7b2c0979abecc1b59fe17b663c6e873cb4abb4b46b76cb748447373103c 发送方账号ff4f74de614be6905951fa2ac68a529a 接收方账号0dfdd3116d26dac4a7349167dfa0ce0a 金额5521773b79160a1a51b9d8f8bfb0a346 完整数据ff4f74de614be6905951fa2ac68a529abb54065906129619b122c978541f0076347086b16d09934e4f9d9dc4ab942af0 原始明文100000000001234510000000000345670000000010000000 SDAx%B[3tBWiCbbGCMGalois/Counter Mode AES-256-GCM简介 GCMGalois/Counter Mode是一种结合计数器模式Counter Mode和Galois域认证的分组加密模式。它不仅能够提供高效的加密服务还能实现消息认证即验证消息的完整性和真实性。与传统的CBC模式不同GCM模式可以并行处理极大提升了性能特别适合高吞吐量的环境。 这是一种 AEADAuthenticated Encryption with Associated Data认证加密算法除了能实现普通加密算法提供的保密性之外还能实现可认证性和密文完整性是目前最推荐的 AES 模式。 使用类似 GCM 的 AEAD 算法进行加解密除了需要提供初始化向量和密钥之外还可以提供一个 AAD附加认证数据additional authenticated data用于验证未包含在明文中的附加信息解密时不使用加密时的 AAD 将解密失败。其实GCM 模式的内部使用的就是 CTR 模式只不过还使用了 GMAC 签名算法对密文进行签名实现完整性校验。 AES-256-GCM工作原理 AES-256-GCM结合了AES-256加密算法和GCM模式具备如下功能 加密数据通过AES-256加密算法被加密。消息认证码MAC在加密的同时GCM模式会生成一个128位的消息认证码用于验证数据的完整性和真实性。这一特性可以防止数据被篡改。附加数据GCM支持附加认证数据AAD这部分数据不会被加密但会被用于认证。例如网络协议中的头部信息可以作为AAD进行保护。 安全优势 相较于其他常见的模式如CBCCipher Block ChainingAES-256-GCM提供了显著的优势 并行处理GCM模式允许多线程并行处理加速了加密和解密过程非常适合高性能需求的场景。集成认证GCM不仅加密数据还生成认证标签保证数据的完整性和真实性。相比之下像CBC这样的模式需要单独实现消息认证。防御重放攻击GCM模式通过计数器的设计有效防止了重放攻击和其他类似的攻击手段。 应用场景 AES-256-GCM的广泛应用场景包括 TLS/SSL加密TLS 1.3推荐使用AES-GCM模式进行数据加密以确保网络通信的安全性。VPN许多VPN协议如IPSec使用AES-256-GCM进行数据传输加密。云存储加密云服务供应商在存储敏感数据时经常采用AES-256-GCM以确保数据的安全性和完整性。 其他模式 和 敏感数据加密建议 除了 ECB 模式外AES 还有 CBC、CFB、OFB 和 CTR 模式。推荐使用 CBC 或 CTR 模式。ECB 和 CBC 模式需要设置合适的填充方式来处理超过一个分组的数据。 此外对于敏感数据加密建议 不要在代码中写死密钥或初始化向量IV应确保密钥和 IV 唯一、独立、且每次都变化。使用独立的加密服务来管理密钥避免将密钥与密文存储在同一个数据库中确保加密服务有严格的管控标准。数据库中不应保存明文敏感信息可以存储脱敏数据并在普通查询时使用脱敏信息。 Code 接下来我们按照如上策略完成相关代码实现: 第一步对于用户姓名和身份证我们分别保存三个信息脱敏后的明文、密文和加密ID。加密服务加密后返回密文和加密 ID随后使用加密 ID 来请求加密服务进行解密 import lombok.Data;import javax.persistence.Entity; import javax.persistence.Id;Data Entity public class UserData {Idprivate Long id;private String idcard;//脱敏的身份证private Long idcardCipherId;//身份证加密IDprivate String idcardCipherText;//身份证密文private String name;//脱敏的姓名private Long nameCipherId;//姓名加密IDprivate String nameCipherText;//姓名密文 } 第二步加密服务数据表保存加密 ID、初始化向量和密钥。加密服务表中没有密文实现了密文和密钥分离保存. import lombok.Data;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;import static javax.persistence.GenerationType.AUTO;Data Entity public class CipherData {IdGeneratedValue(strategy AUTO)private Long id;private String iv;//初始化向量private String secureKey;//密钥 } 第三步加密服务使用 GCM 模式 Galois/Counter Mode的 AES-256 对称加密算法也就是 AES-256-GCM 接下来我们实现基于 AES-256-GCM 的加密服务包含下面的主要逻辑 加密时允许外部传入一个 AAD 用于认证加密服务每次都会使用新生成的随机值作为密钥和初始化向量。在加密后加密服务密钥和初始化向量保存到数据库中返回加密 ID 作为本次加密的标识。应用解密时需要提供加密 ID、密文和加密时的 AAD 来解密。加密服务使用加密 ID从数据库查询出密钥和初始化向量。 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom; import java.util.Base64;Service public class CipherService {//密钥长度public static final int AES_KEY_SIZE 256;//初始化向量长度public static final int GCM_IV_LENGTH 12;//GCM身份认证Tag长度public static final int GCM_TAG_LENGTH 16;Autowiredprivate CipherRepository cipherRepository;//内部加密方法public static byte[] doEncrypt(byte[] plaintext, SecretKey key, byte[] iv, byte[] aad) throws Exception {//加密算法Cipher cipher Cipher.getInstance(AES/GCM/NoPadding);//Key规范SecretKeySpec keySpec new SecretKeySpec(key.getEncoded(), AES);//GCM参数规范GCMParameterSpec gcmParameterSpec new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);//加密模式cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmParameterSpec);//设置aadif (aad ! null)cipher.updateAAD(aad);//加密byte[] cipherText cipher.doFinal(plaintext);return cipherText;}//内部解密方法public static String doDecrypt(byte[] cipherText, SecretKey key, byte[] iv, byte[] aad) throws Exception {//加密算法Cipher cipher Cipher.getInstance(AES/GCM/NoPadding);//Key规范SecretKeySpec keySpec new SecretKeySpec(key.getEncoded(), AES);//GCM参数规范GCMParameterSpec gcmParameterSpec new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);//解密模式cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmParameterSpec);//设置aadif (aad ! null)cipher.updateAAD(aad);//解密byte[] decryptedText cipher.doFinal(cipherText);return new String(decryptedText);}//加密入口public CipherResult encrypt(String data, String aad) throws Exception {//加密结果CipherResult encryptResult new CipherResult();//密钥生成器KeyGenerator keyGenerator KeyGenerator.getInstance(AES);//生成密钥keyGenerator.init(AES_KEY_SIZE);SecretKey key keyGenerator.generateKey();//IV数据byte[] iv new byte[GCM_IV_LENGTH];//随机生成IVSecureRandom random new SecureRandom();random.nextBytes(iv);//处理aadbyte[] aaddata null;if (!StringUtils.isEmpty(aad))aaddata aad.getBytes();//获得密文encryptResult.setCipherText(Base64.getEncoder().encodeToString(doEncrypt(data.getBytes(), key, iv, aaddata)));//加密上下文数据CipherData cipherData new CipherData();//保存IVcipherData.setIv(Base64.getEncoder().encodeToString(iv));//保存密钥cipherData.setSecureKey(Base64.getEncoder().encodeToString(key.getEncoded()));cipherRepository.save(cipherData);//返回本地加密IDencryptResult.setId(cipherData.getId());return encryptResult;}//解密入口public String decrypt(long cipherId, String cipherText, String aad) throws Exception {//使用加密ID找到加密上下文数据CipherData cipherData cipherRepository.findById(cipherId).orElseThrow(() - new IllegalArgumentException(invlaid cipherId));//加载密钥byte[] decodedKey Base64.getDecoder().decode(cipherData.getSecureKey());//初始化密钥SecretKey originalKey new SecretKeySpec(decodedKey, 0, decodedKey.length, AES);//加载IVbyte[] decodedIv Base64.getDecoder().decode(cipherData.getIv());//处理aadbyte[] aaddata null;if (!StringUtils.isEmpty(aad))aaddata aad.getBytes();//解密return doDecrypt(Base64.getDecoder().decode(cipherText.getBytes()), originalKey, decodedIv, aaddata);} }第四步分别实现加密和解密接口用于测试。 可以让用户选择如果需要保护二要素的话就自己输入一个查询密码作为 AAD。系统需要读取用户敏感信息的时候还需要用户提供这个密码否则无法解密。这样一来即使黑客拿到了用户数据库的密文、加密服务的密钥和 IV也会因为缺少 AAD 无法解密. Autowiredprivate CipherService cipherService;// 加密 GetMapping(right)public UserData right(RequestParam(value name, defaultValue 小工匠) String name,RequestParam(value idcard, defaultValue 300000000000001234) String idCard,RequestParam(value aad, required false) String aad) throws Exception {UserData userData new UserData();userData.setId(1L);//脱敏姓名userData.setName(chineseName(name));//脱敏身份证userData.setIdcard(idCard(idCard));//加密姓名CipherResult cipherResultName cipherService.encrypt(name, aad);userData.setNameCipherId(cipherResultName.getId());userData.setNameCipherText(cipherResultName.getCipherText());//加密身份证CipherResult cipherResultIdCard cipherService.encrypt(idCard, aad);userData.setIdcardCipherId(cipherResultIdCard.getId());userData.setIdcardCipherText(cipherResultIdCard.getCipherText());return userRepository.save(userData);}// 解密 GetMapping(read)public void read(RequestParam(value aad, required false) String aad) throws Exception {UserData userData userRepository.findById(1L).get();log.info(name : {} idcard : {},cipherService.decrypt(userData.getNameCipherId(), userData.getNameCipherText(), aad),cipherService.decrypt(userData.getIdcardCipherId(), userData.getIdcardCipherText(), aad));}// 脱敏身份证private static String idCard(String idCard) {String num StringUtils.right(idCard, 4);return StringUtils.leftPad(num, StringUtils.length(idCard), *);}// 脱敏姓名public static String chineseName(String chineseName) {String name StringUtils.left(chineseName, 1);return StringUtils.rightPad(name, StringUtils.length(chineseName), *);} 启动服务访问 http://localhost:45678/storeidcard/right 访问解密接口 http://localhost:45678/storeidcard/read 如果AAD错误 经过这样的设计二要素就比较安全了。黑客要查询用户二要素的话需要同时拿到密文、IV 密钥、AAD。而这三者可能由三方掌管要全部拿到比较困难。
http://www.dnsts.com.cn/news/257557.html

相关文章:

  • 做个人网站用什么程序郴州新网房屋出租
  • 网站内容维护合同如何禁用wordpress播放器
  • 网站的服务器和空间互联网法律服务平台
  • 公司网站开发报价制作网站教程
  • 网站编辑的岗位职责公寓注册公司需要什么条件
  • 优秀的电商设计网站青岛优化网站多少钱
  • 网站建设与维护里面的个人简历整站seo哪家服务好
  • cms网站模板套用教程广州市建设信息网
  • 做早餐的网站openresty wordpress
  • 金融网站如何做设计方案长沙网站设计
  • 网站美化网络营销专业大学
  • 淮安哪有专业做网站的公司四川通信建设工程有限公司网站
  • 网站广告图片设计教程盐山建网站
  • 电商网站硬件配置罗田企业网站建设
  • 互联网做视频网站需要许可证吗网页设计时尚页面
  • 房地产开发网站建设研发网站建设报价
  • 国内做音乐网站盲盒怎么制作教程
  • 做英文小说网站地图设计网站
  • 易县网站建设杭州网页设计培训机构
  • 平面设计相关的网站有哪些内容怎么在后台设计网站
  • 做教育网站挣钱西安官网优化技术
  • 四川省建设信息网站做外贸网站空间多少g
  • 有专门做电商网站的CMS吗ps网页设计说明书
  • 湖州哪里做网站企业信息查询app
  • 四川省建设厅网站官网海南在线分类信息
  • 西安市网站建设公司新建html网站
  • linux 什么做网站好百度怎么精准搜关键词
  • html5 wap网站制作网站的最大公司
  • 法拍重庆网站网站设计教程视频下载
  • 自贡住房和城乡建设厅网站网站制作价格便宜