我想知道哈希是否足够保护隐私,也就是说,如果一个散列的PII仍然被认为是个人识别信息(PII)。
我找到了这篇文章:https://www.johndcook.com/blog/2019/07/20/hashing-pii-does-not-protect-privacy。它说,它不保护隐私,因为空间小,你可以作出估计猜测(蛮力)。我明白了。
我不明白的是,为什么使用盐(当然不是用数据存储)是“无用的”。从该条中:
如果您扔掉了盐分,那么您实际上已经用一个随机字符串替换了每个标识符。然后你有效地删除了这些列,因为它们充满了无用的随机噪声。为什么不干脆删掉呢?
如果您只想检查提供的数据是否与上次相同(比如密码),我不认为它是无用的,它解决了野蛮的猜测攻击。
我是遗漏了什么,还是认为存储的数据足够安全,即它不再是PII?
发布于 2022-04-08 09:58:41
salt可以防止攻击者使用彩虹台预先计算哈希。
但是,如果哈希值的空间足够小,则无论它们是否咸,散列都可以通过蛮力反转。
例如,以信用卡号码为例,它被认为是PII。信用卡号码是16位数字的长度,所以有(只有) 10^16可能的信用卡号码。(由于信用卡号码中的卢恩校验和,它实际上要小得多,但我们还是使用10^16吧)。
假设系统被破坏,数据库中的一个记录的salted_hahsed_credit_card_number字段中存储的值是:
8947b8ef2ae54741eed7b359442cafdc:172e90126cccfe4a8117cce66a50aef96bb8f2263b838b175f072045132ab1d2攻击者查看代码,发现“:”是分隔符,salt是第一个值,盐渍散列信用卡号是第二个值,信用卡编号使用一轮sha256散列进行盐析和散列。
利用ASICS技术,攻击者可以以几千美元的成本构建每秒100 terra散列的钻井平台。迟早,它会找到正确的卡号,即:5105105105105100。可以使用下面的脚本来确认这一点:
import hashlib
creditcardnumber='5105105105105100'
salthex='8947b8ef2ae54741eed7b359442cafdc'
creditcardnumberbytes=creditcardnumber.encode('utf-8')
saltbytes=bytes.fromhex(salthex)
saltedhashedcreditcardnumber=hashlib.pbkdf2_hmac('sha256', creditcardnumberbytes, saltbytes, 1)
saltedhashedcreditcardnumberhex=saltedhashedcreditcardnumber.hex()
storedvalue=salthex + ':' + saltedhashedcreditcardnumberhex
print('stored value', storedvalue)
print('salt', salthex)
print('credit card number', creditcardnumber)它产生:
stored value 8947b8ef2ae54741eed7b359442cafdc:172e90126cccfe4a8117cce66a50aef96bb8f2263b838b175f072045132ab1d2
salt 8947b8ef2ae54741eed7b359442cafdc
credit card number 5105105105105100使用更多的资源密集型散列函数(如bcrypt、scrypt或argon2)和/或使用多轮散列是减少针对盐分哈希的蛮力攻击的有效方法。
https://security.stackexchange.com/questions/261027
复制相似问题