为什么需要对数据“加盐”处理

本文介绍了一种通过在用户密码中添加唯一标识符(如用户名)来增强密码安全性的方法,这种方法被称为“加盐”。通过使用加盐技术,即使两个用户的原始密码相同,其经过加盐处理并加密后的结果也会不同,从而提高了系统的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接对重要数据进行MD5处理后,反向解密确实难度很大,但还是可以找出破绽的,请看下图:


如果名为李自成的用户可以查看数据库,那么他可以观察到自己的密码和别人的密码加密后的结果都是一样,那么,别人用的和自己就是同一个密码,这样,就可以利用别人的身份登录了。

那么我们以前的加密方法是否对这种行为失效了呢?其实只要稍微混淆一下就能防范住了,这在加密术语中称为“加盐”。具体来说就是在原有材料(用户自定义密码)中加入其它成分(一般是用户自有且不变的因素),以此来增加系统复杂度。当这种盐和用户密码相结合后,再通过摘要处理,就能得到隐蔽性更强的摘要值。下面请见代码:
// 对密码进行加盐后加密,加密后再通过Hibernate往数据库里存
        String changedPswd=DigestUtils.md5Hex(name+pswd);

就是这样简单,上面代码中盐就是用户名,可以的话还可以用用户注册时的邮件,注册时间等非空信息(如果是空信息这个加盐处理会失效)。

下面是数据库中两个用户的记录,他们的实际登录密码都是123456,但光看用户记录是完全看不出来的。这下别有用心的人打开数据库看到的密码都完全不一样,他以前的手段就失效了。
### SQL 数据倾斜 加盐 优化 查询性能 分布式处理 在分布式计算中,数据倾斜是一个常见的问题,尤其是在涉及聚合操作或连接操作时。为了解决数据倾斜问题,加盐是一种有效的优化方法。通过在SQL查询中引入随机因子(即“加盐”),可以将原本集中在某些热点key上的数据重新分布到不同的分区中,从而避免单个分区负载过重。 #### 加盐的基本原理 加盐的核心思想是为原始数据中的key添加一个随机值作为辅助字段,使得原本相同的key被拆分成多个不同的key。这样,数据会被均匀地分配到不同的分区中进行处理。最后,在结果输出时再移除这些随机值以恢复原始数据的完整性[^1]。 #### 实现步骤 以下是通过SQL实现加盐的具体方法: 1. **定义随机盐值** 在查询中使用`RAND()`函数生成随机数,并将其与原始key结合。例如,可以通过以下方式生成5个不同的盐值: ```sql SELECT key, value, CAST(RAND() * 5 AS INT) AS salt FROM source_table; ``` 2. **重新分布数据** 将带有盐值的数据重新分布到不同的分区中。这可以通过`DISTRIBUTE BY`或`PARTITION BY`来实现。例如: ```sql INSERT OVERWRITE TABLE target_table SELECT key, value, salt FROM ( SELECT key, value, CAST(RAND() * 5 AS INT) AS salt FROM source_table ) t DISTRIBUTE BY CONCAT(key, '_', salt); ``` 3. **移除盐值并合并结果** 在最终结果中,需要移除盐值并将相同key的数据合并。例如: ```sql SELECT key, SUM(value) AS total_value FROM ( SELECT SUBSTRING_INDEX(CONCAT(key, '_', salt), '_', 1) AS key, value FROM target_table ) t GROUP BY key; ``` #### 示例代码 以下是一个完整的SQL示例,展示如何通过加盐优化查询性能: ```sql -- Step 1: 添加盐值并重新分布数据 INSERT OVERWRITE TABLE temp_table SELECT key, value, CAST(RAND() * 5 AS INT) AS salt FROM source_table DISTRIBUTE BY CONCAT(key, '_', salt); -- Step 2: 移除盐值并合并结果 INSERT OVERWRITE TABLE final_table SELECT key, SUM(value) AS total_value FROM ( SELECT SUBSTRING_INDEX(CONCAT(key, '_', salt), '_', 1) AS key, value FROM temp_table ) t GROUP BY key; ``` #### 注意事项 - **盐值范围的选择**:盐值的范围应根据实际数据量和分区数进行调整。如果盐值范围过小,可能无法有效缓解数据倾斜;如果盐值范围过大,则可能导致过多的小分区,增加Shuffle开销。 - **性能权衡**:加盐虽然能有效解决数据倾斜问题,但会增加数据的复杂性和计算量。因此,在实际应用中需要权衡加盐带来的收益与额外的计算成本[^2]。 #### 相关优化建议 - 使用`repartition()`或`coalesce()`重新分配数据。 - 对于小表,可以考虑使用Broadcast Join来避免Shuffle操作。 - 调整`spark.sql.shuffle.partitions`参数以增加Shuffle过程中的分区数,从而减轻单个分区的数据压力。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值