关于加密:技术分享-详解SQL加密函数AESENCRYPT

作者:岳明强 爱可生北京分公司 DBA 团队成员,人称强哥,负责数据库治理平台的运维和 MySQL 问题解决。善于对 MySQL 的故障定位。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 最近因为客户对于 MySQL 数据加密有一些要求,顺便对于 MySQL 的数据加密钻研了一下。以后 MySQL 原生的数据加密有动态加密,即加密数据库的物理文件,避免间接拖库后读取敏感数据,还有 SQL 级别的加密,只加密局部字段,即便获取到数据,也无奈进行解读。上面次要是对于 SQL 加密函数 AES_ENCRYPT() 的一些阐明 参数阐明解密:AES_DECRYPT():AES_DECRYPT(crypt_str,key_str,init_vector,salt) 加密:AES_ENCRYPT(str,key_str,init_vector,salt) srt:加密之后的字符串 crypt_str:用来加密的字符串,加密后的字段长度能够用以下公式计算,其中 trunc() 示意小数局部舍弃,即如果输出单个字符,那么存储的字段长度即为最短长度16 16 * (trunc(string_length / 16) + 1)key_str:加密密钥,不倡议应用明文密钥,应该先用hash解决一下 init_vector 初始向量,用于块加密的模式(block_encryption_mode),默认的加密模式为aes-128-ecb,不须要初始向量,其它的加密模式(CBC、CFB1、CFB8、CFB128 和 OFB)都须要初始向量,其中 ecb 的加密模式并不平安,倡议应用其它的加密模式,应用 init_vector 加密后 也要应用雷同的 init_vector 解密 kdf_name,salt,info,iterations:为 KDF 的相干参数,绝对于更加平安,官网倡议应用,但因为版本要求过高(5.7.40以及8.0.30之后),这里就先不思考了 应用阐明应用官网 AES(高级加密规范)算法解密数据,默认应用128-bit也能够应用196或者256,密钥的长度与性能和平安度无关, 应用 AES_ENCRYPT()对于基于 statement 的 binlog 类型是不平安的,倡议应用 SSL 连贯,避免将加密函数的明码和其它敏感值作为明文发送到服务器。 简略示例: mysql [localhost:5734] {root} (test) > show create table test;+-------+-----------------------------------------------------------------------------------------------------------------------+| Table | Create Table |+-------+-----------------------------------------------------------------------------------------------------------------------+| test | CREATE TABLE `test` ( `n` char(200) DEFAULT NULL, `t` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 |+-------+-----------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec) mysql [localhost:5734] {root} (test) > insert into test values(aes_encrypt('b','test'),1);Query OK, 1 row affected (0.00 sec) mysql [localhost:5734] {root} (test) > select * from test;+----------------------------+------+| n | t |+----------------------------+------+| x | 0 || y | 0 || ùpñU!ã¿§ÒŸWHƒôò | 1 |+----------------------------+------+3 rows in set (0.00 sec) mysql [localhost:5734] {root} (test) > select aes_decrypt(n,'test') from test where t = 1;+-----------------------+| aes_decrypt(n,'test') |+-----------------------+| b |+-----------------------+1 row in set (0.00 sec)通过加密和压缩的后果返回二进制字符,所以倡议配置为VARBINARY或BLOB二进制字符串数据类型的列,避免字符集转换从而导致插入失败 ...

November 4, 2022 · 2 min · jiezi

关于加密:如何通过百度网盘发送加密文件

以电脑端操作为例: 一、首先咱们关上百度网盘,点击左侧——首页、我的文件,这里咱们能够看到有个新建文件夹,咱们能够建设一个文件夹用来辨别课程或其余视频。 二、新建文件夹填写名称后,双击关上,在下方会有一个上传文件的按钮,点击按钮选取要上传的视频加密文件后,抉择存入百度网盘 三、上传完毕后,右键点击文件夹抉择分享,会呈现一个创立连贯的页面,设置好信息后点击创立链接 四、复制链接关上微信或用其余形式粘贴发送就实现啦!

April 14, 2022 · 1 min · jiezi

关于加密:点盾云播放视频时出现这类提示并退出播放怎么解决

咱们要晓得点盾云属于视频加密软件,为了爱护视频的安全性,在播放时如果遇到具备录屏性能的软件开启,则会呈现一个提醒“检测到疑似开启录屏,近程类软件(QQ、钉钉、gamebar等),请敞开该类程序后应用”而后就会退出播放。那遇到该提醒怎么解决呢?这个时候咱们就要检查一下是否开启了像最常见的QQ、钉钉这种软件了,如果开启那么敞开后就能够失常应用了,然而有时候QQ这些常见的利用敞开后还是有这个提醒,找不出是哪里的起因,这就有可能是电脑上自带一些录屏性能的软件在后盾自启动,那么学员反馈这个问题后,作为商家咱们怎么做呢? 一、关上后盾治理,找到学员应用记录,输出有问题学员的激活码搜寻,会进去学员的信息 二、点击右侧疑似行为查看,就会看到是因为什么起因造成的,(如下图是因为QQ所引起) 三、将引起问题的程序名称发给学员,学员关上工作管理器找到该过程的名称敞开,留神这里须要在详细信息外面找,找到后敞开就能够了。 小编明天就写到这里啦!对于视频加密有什么不理解的能够一起探讨哦~

February 25, 2022 · 1 min · jiezi

关于加密:金融互联网公司如何保证用户私人信息安全

海绵宝宝的懊恼海绵宝宝十分喜爱网上购物,这让他感觉到被资本腐烂的高兴。 然而有一件事他始终感觉很麻烦,疾速上的收件单写满了他的个人信息,撕起来还很麻烦。 快递单号:202202181111收件人姓名:海绵宝宝收件人手机:138 8888 8888收件人地址:太平洋比基尼海滩比奇堡镇贝壳街124号的波萝屋备注:暗号是天王盖地虎你有没有遇到过和海绵宝宝一样的懊恼呢?又是怎么解决的呢? 用户信息隐衷平安今天上线的需要小明往年 26 岁,是一名普普通通的上班族。在某互联网公司做技术开发。 “小明啊,有一个简略的需要。”,产品经理笑着朝小明走来。 “哦,又是简略的需要?”小明看了一下产品,“需要文档写了吗?” “简略的很,写啥文档呀。”,产品经理接着说,“和上次相似,加一个商品交易记录列表就行。这个需要很急哈,今天能上线吧?” “相似个锤子,上次的需要不也是做了一周。你把文档写分明,过一下需要,排期另说。”,小明也不受骗。 在具体设计实现之后,小明开始进行开发阶段。 写的还算比较顺利: public void doTransaction(TransactionDto dto) { // 输入日志 log.info("进行交易:{}", JSON.toJSON(dto)); // 执行业务解决 // 执行落库}TransactionDto 中蕴含了商品购买者的姓名、手机号、寓居地址以及交易的相干信息。 数据库中间接把响应的明文存储,页面间接列表展示。 这个需要很简略,小明想着,就等着测试验证了。 用户信息安全不过在代码评审的时候,项目经理却提出了一个问题,你的代码爱护用户的信息安全了吗? (1)不应该日志中明文输入用户私人信息 (2)不应该页面中明文展现用户私人信息 (3)不应该在数据库中明文存储用户私人信息 并且以快递单号为例子,他应该如下: 快递单号:202202181111收件人姓名:海**宝收件人手机:138 **** 8888收件人地址:太平洋比基尼海滩比奇堡镇********备注:暗号是天王盖地虎这样的益处很显著,就算收件人不去撕掉这张单号,也不会裸露太多用户个人信息。 小明有些不了解,“不让日志输入,那怎么排查问题啊?” “你能够输入脱敏信息。禁止日志输入,就是防止能够查看日志的人,透露用户个人信息。” “那页面不让明文展现,经营怎么解决日常问题呢?” “页面能够增加明文显示的按钮,限定对应的权限,并且记录操作日志。” “数据库不让存储明文,那怎么玩啊?” “你能够去理解下可逆加密。”,项目经理顿了顿,“重写吧,再给你 2 天工夫。” “好吧”,小明有些失落。 技术实现的调整日志脱敏脱敏对于日志脱敏,小明能想到的最间接的办法,就是重载类的 toString() 方然,而后用工具类脱敏敏感信息。 不过他的共事老马给他举荐了一个基于注解的脱敏工具包,用起来还算不便: https://github.com/houbb/sensitive基于注解的日志脱敏。能够自定义策略实现,策略失效条件。常见的脱敏内置计划。java 深拷贝,且原始对象不必实现任何接口。反对用户自定义注解。反对基于 FastJSON 间接生成脱敏后的 json数据库可逆加密为了防止开发者、DBA、歹意攻击者等透露数据库信息,数据库中的敏感信息须要进行加密。 比方数据库中的手机号 phone 13066668888须要调整为如下: phone_chiper BABABABABABABABBABABABA # 加密之后的密文phone_mask 130****8888 # 手机号掩码phone_hash FFFFFFFFFFFFFFFFFFFFFFFF # 手机号哈希加密算法要求是可逆加密,如 AES/3DES/SM4 等。 ...

February 23, 2022 · 1 min · jiezi

关于加密:点盾云为什么会强制退出播放

咱们要晓得点盾云属于视频加密软件,为了爱护视频的安全性,在播放时如果遇到具备录屏性能的软件开启,则会呈现一个提醒“检测到疑似开启录屏,近程类软件(QQ、钉钉、gamebar等),请敞开该类程序后应用”而后就会退出播放。那遇到该提醒怎么解决呢?这个时候咱们就要检查一下是否开启了像最常见的QQ、钉钉这种软件了,如果开启那么敞开后就能够失常应用了,然而有时候QQ这些常见的利用敞开后还是有这个提醒,找不出是哪里的起因,这就有可能是电脑上自带一些录屏性能的软件在后盾自启动,那么学员反馈这个问题后,作为商家咱们怎么做呢? 一、关上后盾治理,找到学员应用记录,输出有问题学员的激活码搜寻,会进去学员的信息 二、点击右侧疑似行为查看,就会看到是因为什么起因造成的,(如下图是因为QQ所引起) 三、将引起问题的程序名称发给学员,学员关上工作管理器找到该过程的名称敞开,留神这里须要在详细信息外面找,找到后敞开就能够了。 小编明天就写到这里啦!对于视频加密有什么不理解的能够一起探讨哦~

February 16, 2022 · 1 min · jiezi

关于加密:私钥公钥是如何工作的

密钥对,私钥,公钥基本概念密钥的分类具体过程 基本概念首先明确几个基本概念: 1、密钥对,在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可颁布,公钥是密钥对持有者颁布给别人的。 2、公钥,公钥用来给数据加密,用公钥加密的数据只能应用私钥解密。 3、私钥,如上,用来解密公钥加密的数据。 4、摘要,对须要传输的文本,做一个HASH计算,个别采纳SHA1,SHA2来取得。 5、数字签名,应用私钥对须要传输的文本的摘要进行加密,失去的密文即被称为该次传输过程的签名。 6、签名验证,数据接收端,拿到传输文本,然而须要确认该文本是否就是发送收回的内容,中途是否已经被篡改。因而拿本人持有的公钥对签名进行解密,失去了文本的摘要,而后应用与发送方同样的HASH算法计算摘要值,再与解密失去的摘要做比照,发现二者完全一致,则阐明文本没有被篡改过。 应用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比方用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会胜利。 密钥的分类对称密钥加密,又称私钥加密或会话密钥加密算法,即信息的发送方和接管方应用同一个密钥去加密和解密数据。它的最大劣势是加/解密速度快,适宜于对大数据量进行加密,但密钥治理艰难。 非对称密钥加密,又称公钥密钥加密。它须要应用不同的密钥来别离实现加密和解密操作,一个公开公布,即公开密钥,另一个由用户本人机密保留,即私用密钥。信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。公钥机制灵便,但加密和解密速度却比对称密钥加密慢得多。 具体过程那么这里一共有两组四个密钥:A的公钥(PUB_A),A的私钥(PRI_A);B的公钥(PUB_B),B的私钥(PRI_B)。 公钥个别用来加密,私钥用来签名。 公钥和私钥惟一对应,用某个公钥签名过得内容只能用对应的私钥能力解签验证;同样用某个私钥加密的内容只能用对应的公钥能力解密。 这时A向B发送信息的整个签名和加密的过程如下:1、A先用本人的私钥(PRI_A)对信息(个别是信息的摘要)进行签名。2、A接着应用B的公钥(PUB_B)对信息内容和签名信息进行加密。 这样当B接管到A的信息后,获取信息内容的步骤如下:1、用本人的私钥(PRI_B)解密A用B的公钥(PUB_B)加密的内容;2、失去解密后的明文后用A的公钥(PUB_A)解签A用A本人的私钥(PRI_A)的签名。 从而整个过程就保障了开始说的端到端的惟一确认。A的签名只有A的公钥能力解签,这样B就能确认这个信息是A发来的;A的加密只有B的私钥能力解密,这样A就能确认这份信息只能被B读取。上面的例子很好了解释了这个问题。how to get public key from private keycreate rsa dsa key with opensslFix ssl key values mistch issuesetup ssh key to login Linuxwhich ssh key is secure

December 23, 2021 · 1 min · jiezi

关于加密:加密软件系统有哪些功能视频加密功能如何做

咱们都晓得视频加密软件次要的目标就是为了爱护视频的安全性,很多人在理解的时候不晓得先从哪些方面去理解,那么能够先理解一下它的性能方面,因为一个产品到底适不适宜本人,首先得先看可不可以满足本人的需要,那这些性能都是怎么做的呢?明天小编就带大家一起来理解一下对于性能方面的小常识吧!作为一款视频加密的软件,所蕴含的性能大抵如下: 1. 高强度加密算法:采取逐帧加密,加密后的视频文件具备防逆向破解性能,点盾云视频加密软件可避免非法复制、破解和数据篡改。 2.智能防录屏机制/防硬件采集:软件能够自动检测各种已知和未知的翻录软件,截屏软件,并且实时上传信息,后盾可查,限度高清接口局部性能,进而避免硬件设施采集视频。 3.反对离线观看:三种创立模式均能反对离线观看,预创立、预申请两种模式想要离线观看,可设置在联网激活后反对10次离线观看,10次后再次联网激活就可。 4.一机一码:输出激活码激活后会主动绑定设施,无效避免了多人共享视频。 5.解冻与召回:可用于某些非凡状况,如:退款,保障视频平安。 5.多平台播放:反对Windows,安卓手机/平板,iPhone/ iPad,Mac多端应用 6.后盾管理系统:后盾提供课程管理、激活码治理,还能够查看学员的设施信息,激活状态及疑似行为等。 以上就是举例的点盾云所蕴含的根底性能啦!还能够设置限度播放日期等小细节性能点,具体的性能能够本人实际上手操作试用哦!

December 22, 2021 · 1 min · jiezi

关于加密:对称加密算法汇总AES-DES-3DES-SM4-java-实现入门

明码的世界如果你是黑帮老大,平时和手下沟通,如何保障本人的信息安全呢? 在神探夏洛克的第一季中,就讲述了一个如何侦破黑帮的加密交换的故事。 这种明码利用的是明码字典。 明码自身能够是一本书,比方常见的《圣经》、《杀死一只知更鸟》,或者纽约地图? 这种加密形式的长处就是如果不晓得字典自身,根本无奈破解。应用起来也非常简单,甚至你能够定期和手下更换字典。 谈到明码,另一个不得不提的故事就是二战时期的明码破译问题。 二战时期,德国创造的 ENIGMA 加密机器,让通信加密从人工手写时代逾越到了机器操作时代,也让人工破译有些无能为力。 为了破译德国的这套加密机器,从剑桥找来了三位优良的数学家:杰弗里期、威尔仕曼、阿兰.图灵。 说到图灵,我想大家肯定都晓得,如果不晓得,倡议珍藏本篇文章,理解之后再持续浏览。 常言道,唯有魔法能够战胜魔法。那能够让奇怪博……啊,不好意思,还是让图灵来吧。 图灵认为使用数学上的 crib 办法来破解 ENIGMA 是可行的,在前期破译了大部分的德军情报信息。 当前的时代,咱们用机器去战胜机器。 加密的可逆性加密算法咱们整体能够分为:可逆加密和不可逆加密;可逆加密又能够分为:对称加密和非对称加密。 当然个别的通信中,咱们都是须要进行解密的。 本文次要介绍近代最有名的四大加密算法:DES 3DES AES 和 SM4。 DES 算法简介DES 全称为 Data Encryption Standard,即数据加密规范,是一种应用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦材料解决规范(FIPS),并受权在非密级政府通信中应用,随后该算法在国内上宽泛流传开来。 设计准则DES设计中应用了分组明码设计的两个准则:混同(confusion)和扩散(diffusion),其目标是抗击敌手对明码零碎的统计分析。 混同是使密文的统计个性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对明码剖析者来说是无奈利用的。 扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输入密文位中,以便在大量的密文中打消明文的统计构造,并且使每一位密钥的影响尽可能迅速地扩大到较多的密文位中,以防对密钥进行逐段破译。 ps: 根本近代的加密算法应该遵循这两个准则,否则就会被统计攻打。 入门应用这里提供了最简略的 DES 实现例子。 import javax.crypto.*;import javax.crypto.spec.DESKeySpec;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.spec.InvalidKeySpecException;/** * DES 工具类 * * @author binbin.hou * @since 0.0.6 */public final class DesUtil { private DesUtil() { } /** * des * * @since 0.0.6 */ private static final String DES = "DES"; /** * 加密 * * @param plainText 待加密内容 * @param password 明码 * @return 加密后果 * @since 0.0.6 */ public static byte[] encrypt(String plainText, String password) { byte[] bytes = plainText.getBytes(); return encrypt(bytes, password); } /** * 加密 * * @param plainText 待加密内容 * @param password 明码 * @return 加密后果 * @since 0.0.6 */ public static byte[] encrypt(byte[] plainText, String password) { try { SecureRandom random = new SecureRandom(); DESKeySpec desKey = new DESKeySpec(password.getBytes()); // 创立一个密匙工厂,而后用它把DESKeySpec转换成 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey secretKey = keyFactory.generateSecret(desKey); // Cipher对象理论实现加密操作 Cipher cipher = Cipher.getInstance(DES); // 用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, secretKey, random); // 当初,获取数据并加密 // 正式执行加密操作 return cipher.doFinal(plainText); } catch (Exception e) { throw new SecretRuntimeException(e); } } /** * 解密 * * @param src byte[] * @param password String * @return 解密后果 * @since 0.0.6 */ public static byte[] decrypt(byte[] src, String password) { try { // DES算法要求有一个可信赖的随机数源 SecureRandom random = new SecureRandom(); // 创立一个DESKeySpec对象 DESKeySpec desKey = new DESKeySpec(password.getBytes()); // 创立一个密匙工厂 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); // 将DESKeySpec对象转换成SecretKey对象 SecretKey secretKey = keyFactory.generateSecret(desKey); // Cipher对象理论实现解密操作 Cipher cipher = Cipher.getInstance(DES); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, secretKey, random); // 真正开始解密操作 return cipher.doFinal(src); } catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException e) { throw new SecretRuntimeException(e); } } /** * 解密 * * @param src byte[] * @param password String * @return 解密后果 * @since 0.0.6 */ public static String decryptToString(byte[] src, String password, String charset) { try { byte[] bytes = decrypt(src, password); return new String(bytes, charset); } catch (UnsupportedEncodingException e) { throw new SecretRuntimeException(e); } } /** * 解密 * * @param src byte[] * @param password String * @return 解密后果 * @since 0.0.6 */ public static String decryptToString(byte[] src, String password) { return decryptToString(src, password, "UTF-8"); }}测试代码测试代码如下: ...

July 15, 2021 · 10 min · jiezi

关于加密:聊聊springboot项目数据库密码如何加密

前言在咱们日常开发中,咱们可能很随便把数据库明码间接明文裸露在配置文件中,在开发环境能够这么做,然而在生产环境,是相当不倡议这么做,毕竟平安无小事,谁也不晓得哪天明码就莫名其妙泄露了。明天就来聊聊在springboot我的项目中如何对数据库明码进行加密 注释计划一、应用druid数据库连接池对数据库明码加密1、pom.xml引入druid包为了不便其余的操作,这边间接引入druid的starter <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency>2、利用com.alibaba.druid.filter.config.ConfigTools生成公私钥ps: 生成的形式有两种,一种利用命令行生成,一种间接写个工具类生成。本文示例间接采纳工具类生成 工具类代码如下 /** * alibaba druid加解密规定: * 明文明码+私钥(privateKey)加密=加密明码 * 加密明码+公钥(publicKey)解密=明文明码 */public final class DruidEncryptorUtils { private static String privateKey; private static String publicKey; static { try { String[] keyPair = ConfigTools.genKeyPair(512); privateKey = keyPair[0]; System.out.println(String.format("privateKey-->%s",privateKey)); publicKey = keyPair[1]; System.out.println(String.format("publicKey-->%s",publicKey)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { e.printStackTrace(); } } /** * 明文加密 * @param plaintext * @return */ @SneakyThrows public static String encode(String plaintext){ System.out.println("明文字符串:" + plaintext); String ciphertext = ConfigTools.encrypt(privateKey,plaintext); System.out.println("加密后字符串:" + ciphertext); return ciphertext; } /** * 解密 * @param ciphertext * @return */ @SneakyThrows public static String decode(String ciphertext){ System.out.println("加密字符串:" + ciphertext); String plaintext = ConfigTools.decrypt(publicKey,ciphertext); System.out.println("解密后的字符串:" + plaintext); return plaintext; }3、批改数据库的配置文件内容信息a 、 批改明码 ...

July 6, 2021 · 4 min · jiezi

关于加密:Helm-插件之-helmsecrets利用-PGP-加密你的-Values-文件-IDCF

在应用 Helm 部署应用程序时,咱们常常会遇到须要为所要部署的应用程序设定敏感信息值的状况,如:为应用程序本身设定登陆名和明码信息,或设定应用程序连贯数据库时所需的信息等等。 若将这些蕴含了敏感信息的值间接以明文的形式存储在自定义的 Values 文件中,尤其是当应用如 Git 等代码版本控制工具追踪 Values 文件时,将会带来十分大的安全隐患。 因而,咱们通常不会将这些蕴含有敏感信息的值保留在 Values 文件中,而是在部署的过程中,通过 HELM 命令的 --set 参数,以命令行的模式为这些变量设定值。 但应用这种形式同样也有它本身的局限性:首先,如果要设定的敏感字段过多,则在命令行中须要指定的参数就越多,这将使得命令行过于简短且容易出错,同时部署人员须要记住的部署参数也变得复杂起来;其次,通过查看零碎执行过的命令历史记录,同样可能获取到在执行 HELM 命令时所有指定的敏感信息参数,这在肯定水平上同样存在安全隐患。 而本文将介绍另一种相对来说比拟完满的解决方案:利用 Helm 的 secrets 插件,将这些蕴含了敏感信息的值通过某种加密伎俩加密之后,在保留到 Values 文件中去。 HELM SECRETS 插件简介helm-secrets 插件能够帮忙咱们将定义在 values.yaml 文件中的值进行加密之后从新存储到 Values 文件中,被加密后的 Values 文件能够被随便散发、存储到代码版本管理工具中而不必放心敏感信息被裸露。上面是一个加密后的 Values 文件示例: #ENC[AES256_GCM,data:IHAqGPYHlUdD2+xSn5ZcYCo=,iv:1KKx8l1zl41LuNYcKw3biXm0vx+vjAeA7wdnNHYjQ6Y=,tag:MmWG4SIeXPt0o0HOHGtJeQ==,type:comment]registry: url: ENC[AES256_GCM,data:sYON9+wBDq9jcmhy8iUaITpIjApLbys=,iv:z/ITKkJp2rS/jMyvxghweA+7W0QlZ98PR+4gDGhX+WI=,tag:TLbCkMcIfW30/80FpaozoA==,type:str] username: ENC[AES256_GCM,data:5Ju2bxk=,iv:hxRUoi0lViW7chOQTiyZyt4nGMS5V5YZyFNf19LmvpA=,tag:lb830A5pnZ4bI0HUosyc7Q==,type:str] password: ENC[AES256_GCM,data:1WmPZCSlzGbSn2LqMc7DmHjQKTjsaPUdn9nMKvbl+KIJ451EPkV0s3dqF+NVZ5E+T6reYN/lY7Ok3VmGvboVAbFs1IYzn7KenbGLMGgCT+JhUFaYz16TeGGsyWDk6YcIIw/XzR6lTjilpHF+DuZuepOyiAnCO0Q5k4aux2lICQh6P8mOezt8flP9/blnFGVZhaaE5r5vT6hsaQbsy7Rnk2lP926xT8NWcaXR85AleRvevQ/zwFIFjjk=,iv:ivA6U20LCHOoR9WGSmuvlJdhnYx/ZC8Pw9czMjNrrlI=,tag:wX3SiiBv8OjSZkpbCznDZw==,type:str]jenkins: master: JCasC: configScripts: credentials-config: ENC[AES256_GCM,data:3dN7KBW...Ov/rsUA=,tag:qlfV/0x0vr45JxMYM1UdMQ==,type:str]sops: kms: [] gcp_kms: [] lastmodified: '2019-07-10T06:21:36Z' mac: ENC[AES256_GCM,data:sKsL25V5yci+oD1PpfA5fU6zE7YCc6Sxg7myE4eqoDcA+guG8gUg4Hcj5yAB4APBq3+KtPIXoF0hNHVYZOOYqZXQrMpO0jASjWHmLAFTUb6FE6xOtb4mP3FBk8W6Km7TfNz3Te8WW4nsb/+c0WmFSQnIolaeXgbbZhZ23x+V9g=1,iv:Oha7rwD2y3xCc+UnI+xXwrnFByMhNJkF84TiYq4/LsWI=,tag:W3e9ox2G9QL5jQEV0VwGA==,type:str] pgp: - created_at: '2019-07-10T06:21:34Z' enc: | -----BEGIN PGP MESSAGE----- hQEMA9Q2nDmrg55qAQf/aXiC7EXZlP5OZDrH3clCb0I9uqP8eNhVgAzqyfSaajGB ... =h7fE -----END PGP MESSAGE----- fp: AD331C18082B4669992805DDCB8EA0C7BC44A464 unencrypted_suffix: _unencrypted version: 3.0.3能够看到,加密操作仅仅是针对 YAML 文件中所有 Key 对应的值进行的,而保留了 Key 本真。绝对于那种针对整个 YAML 文件进行整体加密的形式来说,通过这种加密形式加密后的文件,依然保留了很强的可读性,这使得咱们对加密后的 YAML 文件进行保护变的可能。 ...

June 21, 2021 · 7 min · jiezi

关于GaussDB:数据脱敏数仓安全隐私保护见真招儿

摘要:如何增强技术层面的数据安全和隐衷爱护,对数据仓库产品自身提出更多的性能要求,也是数据安全建设最卓有成效的方法。本文分享自华为云社区《GaussDB(DWS)平安:隐衷爱护现真招儿——数据脱敏》,原文作者:wo华哒哒。 引言大数据时代的到来,颠覆了传统业态的运作模式,激发出新的生产潜能。数据成为重要的生产因素,是信息的载体,数据间的流动也潜藏着更高阶维度的价值信息。对于数据控制者和数据处理者而言,如何最大化数据流动的价值,是数据挖掘的初衷和意义。然而,一系列信息泄露事件的曝光,使得数据安全越来越受到宽泛的关注。 各国各地区逐渐建立健全和欠缺数据安全与隐衷爱护相干法律法规,提供用户隐衷爱护的法律保障。如何增强技术层面的数据安全和隐衷爱护,对数据仓库产品自身提出更多的性能要求,也是数据安全建设最卓有成效的方法。 什么是数据脱敏?数据脱敏(Data Masking),顾名思义,是屏蔽敏感数据,对某些敏感信息(比方,身份证号、手机号、卡号、客户姓名、客户地址、邮箱地址、薪资等等 )通过脱敏规定进行数据的变形,实现隐衷数据的牢靠爱护。业界常见的脱敏规定有,替换、重排、加密、截断、掩码,用户也能够依据冀望的脱敏算法自定义脱敏规定。 通常,良好的数据脱敏施行,须要遵循如下两个准则,第一,尽可能地为脱敏后的利用,保留脱敏前的有意义信息;第二,最大水平地避免黑客进行破解。 数据脱敏分为静态数据脱敏和动态数据脱敏。静态数据脱敏,是数据的“搬移并仿真替换”,是将数据抽取进行脱敏解决后,下发给上游环节,随便取用和读写的,脱敏后数据与生产环境相隔离,满足业务需要的同时保障生产数据库的平安。动态数据脱敏,在拜访敏感数据的同时实时进行脱敏解决,能够为不同角色、不同权限、不同数据类型执行不同的脱敏计划,从而确保返回的数据可用而平安。 GaussDB (DWS)的数据脱敏性能,摒弃业务应用层脱敏依赖性高、代价大等痛点,将数据脱敏内化为数据库产品本身的平安能力,提供了一套残缺、平安、灵便、通明、敌对的数据脱敏解决方案,属于动态数据脱敏。用户辨认敏感字段后,基于指标字段,绑定内置脱敏函数,即可创立脱敏策略。脱敏策略(Redaction Policy)与表对象是一一对应的。一个脱敏策略蕴含表对象、失效条件、脱敏列-脱敏函数对三个要害因素,是该表对象上所有脱敏列的汇合,不同字段能够依据数据特色采纳不同的脱敏函数。当且仅当失效条件为真时,查问语句才会触发敏感数据的脱敏,而脱敏过程是内置在SQL引擎外部实现的,对生成环境用户是通明不可见的。 怎么用数据脱敏?动态数据脱敏,是在查问语句执行过程中,依据失效条件是否满足,实现实时的脱敏解决。失效条件,通常是针对以后用户角色的判断。敏感数据的可见范畴,即是针对不同用户预设的。系统管理员,具备最高权限,任何时刻对任何表的任何字段都可见。确定受限制用户角色,是创立脱敏策略的第一步。 敏感信息依赖于理论业务场景和平安维度,以自然人为例,用户个体的敏感字段包含:姓名、身份证号、手机号、邮箱地址等等;在银行零碎,作为客户,可能还波及银行卡号、过期工夫、领取明码等等;在公司零碎,作为员工,可能还波及薪资、教育背景等;在医疗系统,作为患者,可能还波及就诊信息等等。所以,辨认和梳理具体业务场景的敏感字段,是创立脱敏策略的第二步。 产品内置一系列常见的脱敏函数接口,能够针对不同数据类型和数据特色,指定参数,从而达到不一样的脱敏成果。脱敏函数可采纳如下三种内置接口,同时反对自定义脱敏函数。三种内置脱敏函数可能涵盖大部分场景的脱敏成果,不举荐应用自定义脱敏函数。 MASK_NONE:不作脱敏解决,仅内部测试用。MASK_FULL:全脱敏成固定值。MASK_PARTIAL:应用指定的脱敏字符对脱敏范畴内的内容做局部脱敏。不同脱敏列能够采纳不同的脱敏函数。比方,手机号通常显示后四位尾号,后面用"*"替换;金额对立显示为固定值0,等等。确定脱敏列须要绑定的脱敏函数,是创立脱敏策略的第三步。 以某公司员工表emp,表的属主用户alice以及用户matu、july为例,简略介绍数据脱敏的应用过程。其中,表emp蕴含员工的姓名、手机号、邮箱、发薪卡号、薪资等隐衷数据,用户alice是人力资源经理,用户matu和july是一般职员。 假如表、用户及用户对表emp的查看权限均已就绪。 (1)创立脱敏策略mask_emp,仅容许alice查看员工所有信息,matu和july对发薪卡号、薪资均不可见。字段card_no是数值类型,采纳MASK_FULL全脱敏成固定值0;字段card_string是字符类型,采纳MASK_PARTIAL按指定的输入输出格局对原始数据作局部脱敏;字段salary是数值类型,采纳数字9局部脱敏倒数第二位前的所有数位值。postgres=# CREATE REDACTION POLICY mask_emp ON emp WHEN (current_user != 'alice')ADD COLUMN card_no WITH mask_full(card_no),ADD COLUMN card_string WITH mask_partial(card_string, 'VVVVFVVVVFVVVVFVVVV','VVVV-VVVV-VVVV-VVVV','#',1,12), ADD COLUMN salary WITH mask_partial(salary, '9', 1, length(salary) - 2);切换到matu和july,查看员工表emp。 postgres=> SET ROLE matu PASSWORD 'Gauss@123';postgres=> SELECT * FROM emp; id | name | phone_no | card_no | card_string | email | salary | birthday ----+------+-------------+---------+---------------------+----------------------+------------+--------------------- 1 | anny | 13420002340 | 0 | ####-####-####-1234 | smithWu@163.com | 99999.9990 | 1999-10-02 00:00:00 2 | bob | 18299023211 | 0 | ####-####-####-3456 | 66allen_mm@qq.com | 9999.9990 | 1989-12-12 00:00:00 3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00(3 rows)postgres=> SET ROLE july PASSWORD 'Gauss@123';postgres=> SELECT * FROM emp; id | name | phone_no | card_no | card_string | email | salary | birthday ----+------+-------------+---------+---------------------+----------------------+------------+--------------------- 1 | anny | 13420002340 | 0 | ####-####-####-1234 | smithWu@163.com | 99999.9990 | 1999-10-02 00:00:00 2 | bob | 18299023211 | 0 | ####-####-####-3456 | 66allen_mm@qq.com | 9999.9990 | 1989-12-12 00:00:00 3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00(3 rows)(2)因为工作调整,matu进入人力资源部参加公司招聘事宜,也对员工所有信息可见,批改策略失效条件。postgres=> ALTER REDACTION POLICY mask_emp ON emp WHEN(current_user NOT IN ('alice', 'matu'));切换到用户matu和july,从新查看员工表emp。 ...

April 17, 2021 · 3 min · jiezi

关于加密:Kubernetes-secrets-加密处理的几种方式-IDCF

前言Kubernetes 曾经毫无争议地成为了云原生时代的事实标准,在 Kubernetes 上部署应用程序也变得简略起来(无论是采纳 kustomize 还是 helm),尽管对于敏感信息(比方用户名、明码、token 和证书等)的解决,Kubernetes 本人提供了 secret 这种形式,但其是一种编码方式,而非加密形式,如果须要用版本控制系统(比方 git)来对所有的文件、内容等进行版本控制时,这种用编码来解决敏感信息的形式就显得很不平安了(即便是采纳公有库),这一点在实现 GitOps 时,是一个痛点。 基于此,本文就介绍三种能够加密 Kubernetes secret 的形式:Sealed Secrets、Helm Secrets 和 Kamus。 一、Sealed SecretsSealed Secrets 充分利用 kuberntes 的高扩展性,通过 CRD 来创立一个 SealedSecret 对象,通过将加密的内容存储在扩大 SealedSecret 对象中,而 SealedSecret 只可能被运行于指标集群上的 controller 解密,其余人员和形式都无奈正确解密原始数据。SealedSecret 对象同时又会生成与其名称雷同的 secret 对象,随后就能够依照惯例形式应用 secret 对象了。最初将加密后的文件间接推送至版本控制系统即可,而不必放心敏感信息被透露。 1.1 原理Sealed Secrets 加解密的原理简略来说就是:装置的时候 controller 会生成一对用于加密的 key,加密时在客户端 kubeseal 的帮忙下,将蕴含敏感信息的 kubernets secrets 内容加密转变为一个蕴含有加密信息的 Kubernetes SealedSecrets 对象;解密时在 controller 的帮忙下将 Kubernetes SealedSecrets 对象内的内容进行解密,而后生成惯例的 kubernetes secret 对象。 上面分加解密两局部(encryption 和 decryption)来介绍 Sealed Secrerts 的工作原理。 ...

April 9, 2021 · 9 min · jiezi

关于数据仓库:数据加密你应该知道的数仓安全

摘要:数据加密作为无效避免未受权拜访和防护数据泄露的技术,在各种信息系统中宽泛应用。作为信息系统的外围,GaussDB(DWS)数仓也提供数据加密性能,包含通明加密和应用SQL函数加密。本文分享自华为云社区《你应该晓得的数仓平安——加密函数》,原文作者:zhangkunhn 。 数据泄露防护数据作为信息系统中的外围资产,其机密性、完整性和可用性必须失去保障,以防止数据被非法透露或非法篡改。以后数据泄露事件层出不穷,给集体和企业造成重大损失。 避免数据泄露能够有两种技术门路。一是权限治理,采纳最小化受权准则对应用数据的用户和应用程序受权。另一种是数据加密,包含应用SQL函数加密和通明加密。权限治理在你应该晓得的数仓平安——默认权限实现共享schema一文中有所介绍。本文探讨通明加密,后续博文再谈谈SQL函数加密。 通明加密的利用场景通明加密可能保障用户数据安全。更换磁盘、磁盘流出或者运维非法间接读取磁盘文件会绕过认证、权限治理和审计,从而导致数据泄露的危险。客户对业务数据有很高机密性要求时倡议应用通明加密。 通明加密的原理通明加密性能是对存在硬盘上的用户数据加密存储,对用户及下层应用SQL的利用不感知。通明的含意是指对客户来说是无感知的,仅须要创立GaussDB(DWS)集群时配置通明加密。目前反对行存表和列存表文件的加密存储,反对集群级别的通明加密配置。 集群级别的通明加密意味着集群中的所有库,库中的所有表都是加密存储。集群级别的通明加密还意味着须要在创立集群时进行配置,集群创立之后不可批改,既不能将非加密集群批改为加密集群,也不能将加密集群批改为非加密集群。 加密算法通明加密外围是算法和密钥。咱们采纳AES-128算法,加密模式应用CTR。CTR流加密能够保障明文和密文长度相等,不会导致加密后数据存储空间收缩。 密钥治理应用华为私有云KMS服务治理,保障了用户的密钥平安。加密密钥层次结构有三层。按层次结构顺序排列,这些密钥为主密钥(CMK)、集群密钥 (CEK)、数据库密钥 (DEK)。 主密钥保留在KMS中,用于给CEK加密。CEK用于加密DEK,CEK明文保留在集群内存中,密文保留在服务治理面中。DEK用于加密数据库中的数据,DEK明文保留在集群内存中,密文保留在服务治理面中。 密钥轮转出于平安思考,用户能够执行密钥轮转操作。密钥轮转只轮转集群密钥,不管转数据库秘钥。 通明加密的后续演进集群级通明加密的长处是所有数据包含用户表和零碎表都加密,实用于所有加密需要。一枚硬币的两面性通知咱们,长处也可能是毛病。对所有数据库对象加密会对数据导入和查问带来性能上的开销。 为解决此问题,后续思考反对细粒度通明加密。比方能够反对表级通明加密,用户在创立表时指定属性为加密表,该用户表的数据会加密存储。用户能够在蕴含敏感数据的表中开启加密属性,在查问和应用过程中不感知加解密过程。因为加密粒度较小,对性能的影响也较小。 总结通明加密是保障用户外围数据安全的无效伎俩。从应用场景和原理介绍了GaussDB(DWS)数仓的通明加密个性,指出了后续通明加密个性的钻研方向。 加密算法介绍密码学中明码算法能够分为三类:哈希函数、对称明码算法和非对称明码算法。 哈希函数哈希函数又称为摘要算法,对于数据$$data$$,$$Hash$$函数会生成固定长度的数据,即$$Hash(data)=result$$。这个过程是不可逆的,即Hash函数不存在反函数,无奈由$$result$$失去$$data$$。在不应保留明文场景,比方口令(password)属于敏感信息,系统管理员用户也不应该晓得用户的明文口令,就应该应用哈希算法,存储口令的单向哈希值。 理论应用中会退出盐值和迭代次数,防止雷同口令生成雷同的哈希值,以避免彩虹表攻打。 对称明码算法对称明码算法应用雷同的密钥来加密和加密数据。对称明码算法分为分组明码算法和流明码算法。 分组明码算法将明文分成固定长度的分组,用密钥对每个分组加密。因为分组长度固定,当明文长度不是分组长度的整数倍时,会对明文做填充解决。因为填充的存在,分组明码算法失去的密文长度会大于明文长度。 流明码算法将明文逐比特与密钥流运算。流明码算法不须要填充,失去的密文长度等于明文长度。 非对称明码算法非对称明码算法,又称为公钥明码算法。算法应用两个密钥:公钥和私钥。公钥向所有人公开,私钥窃密。非对称明码算法利用于密钥协商、数字签名、数字证书等畛域。 加密函数SQL接口GaussDB(DWS)次要提供了哈希函数和对称明码算法。哈希函数反对sha256, sha384, sha512和国密sm3。对称明码算法反对aes128, aes192, aes256和国密sm4。 哈希函数md5(string)将string应用MD5加密,并以16进制数作为返回值。MD5的安全性较低,不倡议应用。 gs_hash(hashstr, hashmethod)以hashmethod算法对hashstr字符串进行信息摘要,返回信息摘要字符串。反对的hashmethod:sha256, sha384, sha512, sm3。 testdb=# SELECT gs_hash('GaussDB(DWS)', 'sha256'); gs_hash ------------------------------------------------------------------ cc2d1b97c6adfba44bbce7386516f63f16fc6e6a10bd938861d3aba501ac8aab(1 row)对称明码算法gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)采纳cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。反对的cryptotype:aes128, aes192, aes256, sm4。反对的cryptomode:cbc。反对的hashmethod:sha256, sha384, sha512, sm3。testdb=# SELECT gs_encrypt('GaussDB(DWS)', '1234', 'aes128', 'cbc', 'sha256'); gs_encrypt -------------------------------------------------------------------------------------------------------------------------- AAAAAAAAAADlzZYiNQK1uB+p1gza4Lu3Moj3HdP4E1uJmqfDYBaXDLMt7RZoE0YVx9h2dMRYBQ5fhFNqqM49sUkeS72o8kX5vWRQvfW3fuocGyp+b+lX9A==(1 row)gs_decrypt(decryptstr, keystr,cryptotype, cryptomode, hashmethod)采纳cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对decryptstr字符串进行解密,返回解密后的字符串。解密应用的keystr必须保障与加密时应用的keystr统一能力失常解密。testdb=# SELECT gs_decrypt('AAAAAAAAAADlzZYiNQK1uB+p1gza4Lu3Moj3HdP4E1uJmqfDYBaXDLMt7RZoE0YVx9h2dMRYBQ5fhFNqqM49sUkeS72o8kX5vWRQvfW3fuocGyp+b+lX9A==', '1234', 'aes128', 'cbc', 'sha256'); gs_decrypt -------------- GaussDB(DWS)(1 row)利用举例有个student表,有id,name和score三个属性。name能够应用哈希函数加密保留,score能够应用对称明码算法保留。 ...

March 27, 2021 · 1 min · jiezi

关于加密:密码学系列之内容嗅探

简介内容嗅探,也被称为媒体类型嗅探或MIME嗅探,是查看一个字节流的内容,试图推断其中数据的文件格式的做法。内容嗅探通常用在媒体类型没有被精确指定的状况,用于弥补元数据信息。 本文将会解说内容嗅探的罕用场景和可能呈现的问题。 MIME typesMIME的全称是Multipurpose Internet Mail Extensions,多用途互联网邮件扩大。它是一种规范,它表明了文档、文件或各种字节的性质和格局。它是在IETF的RFC 6838中定义的。互联网编号调配机构(IANA)负责定义所有官网的MIME类型。 MIME的构造蕴含两局部,别离是type和subtype,他们以 / 来进行宰割: type/subtype类型代表数据类型所属的个别类别,如视频或文本。子类型确定MIME类型所代表的指定类型的确切数据品种。例如,对于 MIME 类型的文本,子类型可能是 plain(纯文本)、html(HTML 源代码)或日历(对于 iCalendar/.ics)文件。 每种类型都有它本人的一套可能的子类型, 一个MIME类型必须蕴含一个类型和一个子类型。 还能够在前面加上额定的参数: type/subtype;parameter=value例如,对于主类型是text的任何MIME类型,可选的charset参数能够用来指定数据中字符的字符集。如果没有指定字符集,默认为ASCII (US-ASCII),除非被用户代理的设置笼罩。要指定UTF-8文本文件,则应用MIME类型text/plain;charset=UTF-8。 MIME类型不辨别大小写,但传统上用小写,但参数值除外,因为参数值的大小写可能有或没有特定的意义。 MIME有两中类型,别离是discrete 和multipart。 离散类型是代表繁多文件或媒介的类型,如繁多文本或音乐文件,或繁多视频。 多局部类型是指由多个组件组成的文件,每个组件都有本人独立的MIME类型;或者,指封装在一个事务中一起发送的多个文件。例如,电子邮件中多个附件就是一种多局部MIME类型。 咱们看下常见的discrete类型: application, 比方:application/octet-stream,application/pdf,application/pkcs8和application/zip等。audioList, 比方:audio/mpeg,audio/vorbis。font, 比方:font/woff,font/ttf和font/otf。image,比方:image/jpeg,image/png和image/svg+xml。model, 比方:model/3mf 和model/vml。text,比方:text/plain, text/csv 和 text/html.video,比方:video/mp4。常见的Multipart类型如下: message,比方:message/rfc822和message/partial。multipartList, 比方:multipart/form-data 和 multipart/byteranges。浏览器嗅探因为浏览器应用MIME类型,而不是文件扩展名来决定如何解决一个URL,所以Web服务器在响应的Content-Type头中发送正确的MIME类型十分重要。如果没有正确配置,浏览器很可能会误会文件的内容,网站将无奈失常运行,下载的文件也可能会被错误处理。 为了解决这个问题,或者说是更好的用户体验,很多浏览器会进行MIME内容嗅探,也就是通过解析文件的内容,来猜想MIME类型的格局。 不同的浏览器解决MIME嗅探的形式是不一样的。然而他们都可能会产生重大的安全漏洞,因为有些MIME类型是可执行类型的,歹意攻击者能够通过混同MIME嗅探算法,从而使攻击者能够进行网站运营者或用户都没有预料到的操作,如跨站脚本攻打。 如果不想浏览器端进行嗅探,能够在服务端的响应中设置 X-Content-Type-Options 头,比方: X-Content-Type-Options: nosniff这个头最早是在IE 8中反对的,不过当初所有的浏览器根本都反对这个head类型了。 客户端嗅探咱们通常须要在JS中判断浏览器是否是IE浏览器,而后做响应的解决: var isIEBrowser = false;if (window.ActiveXObject) { isIEBrowser = true;}// Or, shorter:var isIE = (window.ActiveXObject !== undefined);下面的例子就是非常简单的客户端嗅探,通过判断window是否有ActiveXObject 这个属性来确定这个浏览器是否是IE浏览器。 本文已收录于 http://www.flydean.com/content-sniffing/最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现! ...

March 10, 2021 · 1 min · jiezi

关于加密:2021年用更现代的方法使用PGP下

上篇链接:2021年,用更古代的办法应用PGP(上)2021年,用更古代的办法应用PGP(中) PGP 公钥的 公布 与 替换探讨公钥平安替换的中文文章比拟少,而这一环是整个加密体系的重中之重。 大部分的PGP教程最初一步就是让小白用户将公钥上传,这是十分过期,且不负责任的,所以这里来具体介绍下PGP 公钥的 公布 与 替换。 准则首先明确一点: 上传公钥到 公钥服务器 不是必要的,甚至是危险的。 如果你是老手,请不要公布你的公钥到 公钥服务器。 引子通过前文,你曾经相熟了gpg的本地应用, 并且生成了本人的PGP 密钥对。 设想一下, 如果你生存在1980年代, 想和远方的敌人加密通信,须要先替换彼此的公钥,又没有一个对立的可信的认证机构,这时会有什么问题? 当面替换吗?当然是个方法,然而置信你不会想要将下列 这么长的公钥缮写到纸上,而后开车送到敌人那里,再让敌人照着这个输出他的电脑。如果两头有变动,须要反复以上过程n次。 那么还有其余方法吗? 那个时代还没有line、wechat这类即时通讯软件,而邮件提供商默认是不牢靠的,不然也不会有PGP的诞生。 并且彼时https还未呈现,用邮件替换PGP替换公钥显然不太平安。 你们单方都须要便捷地替换公玥, 并且确认彼此失去的公钥的确是未经篡改过的,真实有效的,就成了一个难题,这样,公钥服务器也就跃然纸上了。 公钥服务器 KeyServer公钥服务器使得人们只须要替换他们短短的key id 或者user id就能够不便地从公钥服务器下载公钥。 历史与设计初衷第一个KeyServer 叫做 HKP( web-based OpenPGP HTTP Keyserver Protocol) Keyserver , 诞生在上世纪90年代,是Marc Horowitz在麻省理工学习时为了他的论文而搭建的。在此之前, 尽管不是那么平安, 然而大部分人依附电子邮件来替换公钥。 尽管服务器有了, 但开发者们放心政府会试图强制钥匙服务器运营商用政府抉择的各种证书来替换证书。 所以他们做出了一个决定:公钥服务器永远不会删除信息。公钥服务器能够为现有的证书增加信息(比方能够revoke/sign或者调整expire工夫),但永远永远永远不会删除证书或证书的信息。 为了达到这个指标,他们开始运行一个分布式的国内公钥服务器网络,这就是当初的KeyServer。世界各地的公钥服务器会定期互相通信,同步,比拟目录。如果政府强制公钥服务器运营商删除或批改证书,那么在比拟步骤中就会被发现。完好的公钥服务器会用完整钥匙服务器目录中的内容更新本人。 任何货色都不会被删除,听起来很美妙,也是解决政府审查问题的一个简略而无效的方法,可是正是这个准则起初给KeyServer带来了无穷无尽的问题。 信赖网络 (Web of Trust)好了,当初咱们有了一个能够不便地上传和下载公钥的中央, 这样是不是就高枕无忧了呢? 对于KeyServer 来说,任何人都能够上传公钥并宣称本人是Linus, 是Zuckerberg,或是任何其他人,而KeyServer并不会去验证你是否是你所宣称的人(因为KeyServer原本就没有一个中心化的运营者)。 如果你有一些密码学的根底, 那么就会晓得, PGP协定依附的非对称加密算法, 最软弱的点就在于公钥的替换这一步。公钥替换时最容易收到中间人攻打,你肯定要确定你接管到的公钥的确是你想交换的人的,由此TSL引入了CA证书认证体系,由一个可信的权威第三方来认证并颁发证书来解决身份的认证问题。 (具体可参见https系列没那么浅地谈谈HTTP与HTTPS)。 “信赖一个权威的第三方” 对于最后的极具备hack精力的开发者们来说, 显然是无奈承受的。 ...

January 27, 2021 · 2 min · jiezi

关于加密:解读登录双因子认证MFA特性背后的TOTP原理

摘要:随着互联网明码泄露事件频发,越来越多的产品开始反对多因子认证(MFA),TOTP则是MFA畛域里最广泛的一种实现形式,本文介绍TOTP的原理和华为云的实践经验。原理TOTP(Time-Based One-Time Password)算法是基于工夫的一次性明码算法,依据预共享的密钥与以后工夫计算一次性明码。它已被互联网工程工作组接收为RFC 6238规范,成为被动凋谢认证的基石,并被用于泛滥多因子认证零碎当中。 TOTP其实并不是一种全新的算法,能够看成是HOTP(HMAC-Based One-Tme Password)算法的一个具体化的场景。HOTP的算法能够在RFC 4226看到详细描述,所以相比HOTP算法,TOTP的RFC文档看起来十分简洁。 下面是HOTP算法的公式,参数K示意共享密钥,参数C示意计数器counter。 TOTP算法实际上是以工夫变量作为参数C的HOTP算法,所以TOTP算法的公式应该是 参数K依然示意共享密钥,而参数T示意工夫变量。 工夫变量TTOTP的外围和实际计划也是围绕工夫变量T,但T不是简略的工夫戳, X示意步长,默认是30秒,T0示意UTC工夫的起始工夫戳,即1970年一月一日,Floor函数向下取整。T必须是一个大于32bit的整型,能力反对到2038年当前。例如当X=30时,59对应的T为1,60对应的T为2。 TOTP在MFA上的利用MFA(Multi-Factor Authentication),多因子认证,是计算机系统中一种进行身份认证的办法,用户须要通过两种或两种以上的认证伎俩的校验能力进入零碎,拜访资源。 开明MFA个别都须要先在登录认证零碎中将用户的身份和用户的物理设施进行绑定关联,在登录过程中,除了输出明码(用户晓得的),还须要输出用户的物理设施(用户持有的)上显示的拜访码(passcode)来实现整个身份验证。阐明:不是所有的MFA验证过程都须要用户被动输出拜访码。 上图示意的过程即MFA的通用流程,例如咱们应用网银进行转账就须要拿出在银行窗口开户时银行提供的一个U盾,按下按钮,U盾上即显示一串数字,输出这次数字到网银软件上能力实现转账。 但上图的MFA流程存在一个工程难题,即第4步中认证零碎后端还须要向MFA设施(或MFA设施的后盾零碎)进行一次验证,这个验证过程限度了MFA的利用场景,运行在企业数据中心的认证服务器个别不被容许拜访公网,即便拜访公网也会因为网络时延导致登录体验变差,TOTP算法的利用很好的解决了这个难题。 应用TOTP算法,只有客户端(证实方)和服务端(校验方)放弃时钟统一,且单方事后设置好一个共享密钥的前提下,在同一个工夫片段内算进去的值是一样的。正是基于这样的原理,在认证零碎中先将用户身份和该共享密钥绑定,再将共享密钥置入物理设施,在认证过程中,物理设施和认证零碎各自通过TOTP算法依据共享密钥和工夫戳计算出拜访码,只有拜访码比照统一就能证实用户持有该物理设施,整个认证过程中物理设施和认证零碎不须要有交互,非常灵活。 基于TOTP算法的设施,能够分为虚构(软件)MFA和硬件MFA。 虚构MFA虚构MFA即通过软件来模仿硬件MFA设施,在手机上安装一个反对TOTP协定的APP,例如Google Authenticator, Microsoft Authenticator,华为云APP也同样反对规范的TOTP协定。虚构MFA通过扫码二维码图片或者手工输出的形式置入校验方生成的共享密钥,并且能够同时关联多个校验方,十分不便实用。 硬件MFA下图中是一种信用卡形态的硬件MFA,能够放到钱包里,在须要时按下卡片上的按钮即可显示六位数字,十分便携。 平安思考1.哈希算法TOTP算法的强度取决于背地的HOTP算法,但HOTP的哈希函数是HMAC-SHA1,并不是我司举荐的平安算法。TOTP算法在具体实现中也能够应用HMAC-SHA256或HMAC-SHA512,但应用HMAC-SHA1依然是最通用,兼容性最好的实现,Google Authenticator就是应用HMAC-SHA1。 2.密钥随机性对TOTP算法最可能的攻打伎俩就是暴力破解,因而共享密钥必须是密码学平安的密钥,足够随机。密钥长度应该和哈希算法的长度尽量匹配。 另外,校验方必须将密钥寄存在平安的区域,应用加密形式保留,避免泄露,只有在须要验证OTP的时候才解密。同时还须要限度最小权限,只有校验方本身能力拿到密钥。 3.通信安全证实方和校验方应该应用平安的通道通信,例如SSL/TLS。 4.防暴力破解个别TOTP用于MFA时,校验方只会要求输出6位数字,很容易被暴力破解,在工程实际中能够当第二因子的尝试失败达到肯定次数后锁定客户端。 5.放弃一次性TOTP算法在同一个工夫片段(例如,30s)内的输入都是一样的,如果同一个TOTP验证曾经胜利验证过一次,该验证码的第二次尝试应该被回绝,这样能力保障OTP“一次性”的根本性质。 6.工夫片段工夫片段越长,被破解的危险就越高,但思考到证实方须要人工输出验证码,应该留下足够的操作工夫。举荐应用30秒作为默认工夫片段,在平安和易用性之间达到一个均衡。 可用性思考1.“后向兼容”因为证实方和校验方都是基于工夫来计算OTP,如果证实方在一个工夫片段的最初时刻发送OTP,在申请达到校验方时,曾经进入下一个工夫片段,如果校验方应用以后工夫来计算OTP,必定会匹配失败,这样会导致肯定的失败率,影响可用性。 校验方应该不仅仅以接管申请的工夫,还应该用上一个工夫片段来计算TOTP,加强容错性。不过,容错窗口越长,被攻打危险越高,“后向兼容”个别举荐不超过一个工夫片段。 2.反对校准证实方和校验方的时钟可能不完全一致,特地是很长一段时间没有进行过TOTP认证,时钟偏移导致匹配失败。校验方的认证零碎能够提供一种校准(re-sync)的能力,让证实方输出TOTP验证码,校验方往前计算两个工夫片段(60s),往后计算一个工夫片段(29s),通过匹配后果记录证实方的时钟的偏差值,实现时钟校准。在证实方当前发动验证时,校验方间接应用偏差值计算TOTP。但如果厂商曾经反对足够的“后向兼容”,校准不肯定须要反对。 点击关注,第一工夫理解华为云陈腐技术~

November 18, 2020 · 1 min · jiezi

关于加密:先加密后签名是不是安全看完这篇就秒懂

摘要:很多平安标准及平安文章中都提到一条规定:先加密后签名是不平安的,该当先签名后加密。这条规定背地的原理是什么?先加密后签名肯定不平安吗?本文为您一一解答。先签名后加密是指先对音讯进行签名,而后对音讯的签名值和音讯一起进行加密。如果采纳先加密后签名的形式,接管方只能晓得该音讯是由签名者发送过去的,但并不能确定签名者是否是该音讯的创建者。比方在发送一个认证凭据时采纳先加密后签名的形式,音讯在发送过程中就有可能被第三方截获并将认证凭据密文的签名值批改为本人的签名,而后发送给接管方。第三方就有可能在不需晓得认证凭据的状况下通过这种形式来通过认证获取权限。 采纳先签名后加密形式能够防止这类问题的产生,因为只有在晓得音讯明文的状况下能力对其进行签名。 尽管不同的标准形容有差别,但外围观点都是“先签名后加密”。然而这条标准的实用场景是什么呢,“先加密后签名”肯定不平安吗?须要深挖一下。 如果应用“先加密后签名”,则音讯发送方Alice和音讯接管方Bob的处理过程如下图: Alice发送的明文音讯先通过Alice私钥签名,再将音讯明文和音讯签名一起应用Bob的公钥加密,密文通过网络传输到Bob。因为Bob应用私钥解密还原出音讯明文和签名,而私钥只有Bob持有,这能保障音讯明文不会泄露给第三方Eve,而后Bob应用Alice的公钥验证音讯明文和签名是否统一,因为Alice的签名只有Alice的公钥能力验证,这能保障音讯肯定来自Alice,不可抵赖,且没有被第三方Mallory篡改。在拿不到音讯明文的状况下,无奈计算出音讯签名,而还原音讯明文又必须应用Bob的私钥,这样就能防止网络传输过程中的中间人进行篡改攻打。 如果“先加密后签名”,会存在什么样的攻打危险呢,先看下“先加密后签名”的解决流程: 音讯明文应用Bob的公钥加密,不可能泄露给第三方,签名也有了,能够防篡改,不认真看的话,仿佛没什么问题。持续看上面这张图: 如果存在一个中间人Mallory能够拦挡Alice和Bob的音讯,在不篡改音讯明文和密文的状况下,应用Mallory的私钥对音讯密文进行签名,并替换Alice原始的签名,最初篡改后的音讯传输给接管方Bob,Bob依然能够胜利解密明文,同时用Mallory的公钥胜利验证签名,最终这条音讯会被Bob认为是Mallory发送的非法音讯。 “先加密后签名”肯定不平安吗从下面的演示来看,“先加密后签名”仿佛肯定不平安,是这样吗?中间人Mallory针对“先加密后签名”进行替换签名攻打得手的前提条件: 1、 接管方Bob依据签名内容中的证书ID找到对应的Mallory公钥来验证签名。 2、 接管方Bob仅应用公钥验签来辨认发送方的身份。 只有突破下面的任意一个前提,“先加密后签名”也是平安的: 1、 Bob应用固定的公钥来验证签名,而不是依据签名内容来找对应公钥,或者不应用多个公钥尝试验签。即Mallory替换签名后,Bob依然用Alice的公钥验证签名,必定能发现申请被篡改。 2、 Bob应用公钥+应用层属性一起辨认发送方的身份,假如Alice在音讯明文中携带本人的用户ID,Bob验证公钥和用户ID是否匹配,即便Mallory替换签名也无奈攻打。 所以“先加密后签名”是不是平安,还要看业务利用是怎么设计的,不能相对的认定为不平安。 本文分享自华为云社区《“先签名后加密”的思考》,原文作者:卡农。点击关注,第一工夫理解华为云陈腐技术~

November 13, 2020 · 1 min · jiezi