MySQL中哈希SSN作为密钥的替代方案

MySQL中哈希SSN作为密钥的替代方案,mysql,encryption,Mysql,Encryption,我有一个类似以下的问题: 一个人开始作为A公司的顾问工作。他们的人力资源人员为他们建立了一个账户。将在person表和person company表中为person创建记录 此人也为B公司工作,A公司可能知道也可能不知道。当公司B输入他们的信息时,他们不应该亲自创建记录,而应该亲自创建一个记录 该人员需要为州政府进行培训,因此,如果他们在进行培训时登录到任何一家公司的网站,我们希望该人员的总时间保持不变 我可以为person表设置一个PK,然后将他们加入到每个公司,但是我想我需要一些东西,比如p

我有一个类似以下的问题:

一个人开始作为A公司的顾问工作。他们的人力资源人员为他们建立了一个账户。将在person表和person company表中为person创建记录

此人也为B公司工作,A公司可能知道也可能不知道。当公司B输入他们的信息时,他们不应该亲自创建记录,而应该亲自创建一个记录

该人员需要为州政府进行培训,因此,如果他们在进行培训时登录到任何一家公司的网站,我们希望该人员的总时间保持不变

我可以为person表设置一个PK,然后将他们加入到每个公司,但是我想我需要一些东西,比如person的SSN的哈希,外加一些额外的xyz,以便能够进行查找。B公司将为该人员提供SSN,该SSN应是通用的

问题:

1有没有其他你们认为效果更好的方法加入

2如果我使用哈希SSN方法,那么MySQL/PHP单向加密的最佳加密方式是什么

我在别处读到,公钥/私钥解决方案可能是最好的,但由于此人最初没有建立自己的帐户,我不确定这将如何工作


谢谢

PKI对于您的用例来说过于复杂,可能会增加系统中的安全漏洞数量。使用哈希SSN将是快速和相当可移植的——我建议使用SHA-2。事实上,建议将其作为系统的一部分。

PKI对于您的用例来说过于复杂,可能会增加系统中的安全漏洞数量。使用哈希SSN将是快速和相当可移植的——我建议使用SHA-2。事实上,建议将其作为散列的一部分。

为了使散列安全,您确实需要一个随机salt来防止rainbow攻击。但是,随机salt将排除将其用作查找值的能力

在散列中加上此人的姓氏总比什么都不加好,而且它仍然允许您执行查找

PKI算法通常比使用相同密钥长度的良好对称算法弱,因此,如果您正在考虑使用可逆加密算法,则不希望使用PKI

一个随机盐渍的单向散列算法将是理想的,SHA1和以上应该是好的,尽管PBKDF2会更好


MySQL 5.5+支持SHA2,SHA1和SHA2都返回十六进制编码的哈希值,因此可以将其存储在索引的固定长度字符列中。

为了使哈希安全,您确实需要一个随机salt来防止rainbow攻击。但是,随机salt将排除将其用作查找值的能力

在散列中加上此人的姓氏总比什么都不加好,而且它仍然允许您执行查找

PKI算法通常比使用相同密钥长度的良好对称算法弱,因此,如果您正在考虑使用可逆加密算法,则不希望使用PKI

一个随机盐渍的单向散列算法将是理想的,SHA1和以上应该是好的,尽管PBKDF2会更好

MySQL 5.5+支持SHA2,SHA1和SHA2都返回十六进制编码的哈希值,因此可以将其存储在索引的固定长度字符列中。

我认为这可能与您的操作非常相关。如果出于安全原因和法律责任,您确实希望匿名化SSN,那么仅仅对它们进行散列是不够的

仅仅对它们进行散列将是一个完全确定的过程,因此为了有效地屏蔽单个SSN,该过程需要随机化。否则,您可以简单地强制执行所有可能的SSN组合,这比尝试强制执行哈希函数并查找匹配值所需的工作量要少得多

要了解为什么会出现这种情况,请举一个最简单的例子,即SSN可以只使用两个值,0和1。不管散列函数的质量和强度如何,最终只会有两种可能的结果,很容易看出哪个是哪个

这是一个古老的游戏,为什么你不应该在没有对密码进行预处理的情况下直接对密码进行哈希运算。底层数据只是没有包含足够的熵,因此很容易成为在预计算表中查找的目标

一旦您的SSN成为私有和机密,它们并不在每个国家/地区,因此请原谅我在评论中提出的愚蠢问题:,同样用于密码存储的最佳实践也应适用于您的特定情况,也就是说,一种缓慢的自适应哈希算法,可以补偿初始熵的不足,如Marcus Adams已经推荐的bcrypt、scrypt和PBKDF2。

我认为这可能与您正在做的事情非常相关。伊夫林德 d出于安全原因和法律责任,您希望匿名化SSN,那么仅仅对它们进行散列是不够的

仅仅对它们进行散列将是一个完全确定的过程,因此为了有效地屏蔽单个SSN,该过程需要随机化。否则,您可以简单地强制执行所有可能的SSN组合,这比尝试强制执行哈希函数并查找匹配值所需的工作量要少得多

要了解为什么会出现这种情况,请举一个最简单的例子,即SSN可以只使用两个值,0和1。不管散列函数的质量和强度如何,最终只会有两种可能的结果,很容易看出哪个是哪个

这是一个古老的游戏,为什么你不应该在没有对密码进行预处理的情况下直接对密码进行哈希运算。底层数据只是没有包含足够的熵,因此很容易成为在预计算表中查找的目标



一旦您的SSN成为私有和机密,它们并不在每个国家/地区,因此请原谅我在评论中提出的愚蠢问题:,同样用于密码存储的最佳实践也应适用于您的特定情况,即,一种缓慢的自适应哈希算法,用于补偿初始熵的不足,如Marcus Adams已经推荐的bcrypt、scrypt和PBKDF2。

如果SSN已经是通用的,为什么需要进一步哈希?您的密钥就在那里,还是有其他要求?@emboss-因为存储SSN会增加您的法律责任和潜在的安全风险。散列的SSN只是一个单向查找,以查看人员是否已在系统中设置,并且只会被查询到。。。从未被选中或通过。更担心的是,如果DB以我没有想到的方式暴露,会发生什么。如果SSN已经是通用的,为什么你需要进一步散列它?您的密钥就在那里,还是有其他要求?@emboss-因为存储SSN会增加您的法律责任和潜在的安全风险。散列的SSN只是一个单向查找,以查看人员是否已在系统中设置,并且只会被查询到。。。从未被选中或通过。更担心的是,如果数据库以我没有想到的方式被暴露,会发生什么。我坚持使用MySQL 5.1,它只有sha1可用。我可以用php做这个。。。散列'sha256','xyz123456789abc';我相信,那就把它当作一个魔咒来储存吧。我相信VARBINARY或BLOB是存储加密数据的推荐MySQL类型。SHA-1实际上还没有在野外被破坏过,所以你可以用它。但是,如果您最关心的是安全性,那么请在PHP中计算哈希值,并使用VARBINARY或BLOB存储在MySQL中。如果您将其存储在char类型中,请先将其编码为十六进制或base64,请注意,作为字符,您需要将散列的输出大小增加一倍。@owlstead-我想您的意思是对马库斯答案的评论。我对OP的建议是将散列存储为VARBINARY或BLOB。@Perception:我的意思是回复Don,他谈到了使用char96作为散列结果。我坚持使用MySQL 5.1,它只有sha1可用。我可以用php做这个。。。散列'sha256','xyz123456789abc';我相信,那就把它当作一个魔咒来储存吧。我相信VARBINARY或BLOB是存储加密数据的推荐MySQL类型。SHA-1实际上还没有在野外被破坏过,所以你可以用它。但是,如果您最关心的是安全性,那么请在PHP中计算哈希值,并使用VARBINARY或BLOB存储在MySQL中。如果您将其存储在char类型中,请先将其编码为十六进制或base64,请注意,作为字符,您需要将散列的输出大小增加一倍。@owlstead-我想您的意思是对马库斯答案的评论。我对OP的建议是将散列存储为VARBINARY或BLOB。@Perception:我的意思是回复Don,他谈到了使用char96作为散列结果。+1我会在密码前预加一个主机名或一个随机字符串,以防止跨站点使用相同名称/密码的人。OP不存储密码,由于散列必须可以从不同的主机上计算,因此salt不能完全是随机的。我可能不能完全监督这种情况,但如果你不能使用预先计算的、随机的、公开可见的salt,那将是一种奇怪的情况。一种基于某种半私有的预先计算的散列,不变的信息肯定会起作用。+1我会在密码前预加一个主机名或只是一个随机字符串,以防止跨站点使用相同名称/密码的人。OP不存储密码,由于散列必须可以从不同的主机上计算,因此salt不能完全是随机的。我可能不能完全监督这种情况,但如果你不能使用预计算的、随机的、公共的
不可见的盐。基于某些半私有、不变信息的预先计算的哈希肯定会起作用。因此,在RTFA之后,链接到它听起来像是对mysecretword进行哈希运算。$ssn会使预先猜测ssn值变得非常困难。然后,根据另一个建议,我应该在MySQL中存储一个varbinary字段。THX随机化是必要的,是的。但是仅仅一个盐可能是不够的,同样的原因,它不被认为是足够的密码。你还需要减慢散列计算的速度,这就是为什么我考虑使用PBKDF2和同事的原因。因此,在RTFA之后,你链接到它听起来像是在散列mysecretword。$ssn会使预先猜测ssn值变得相当困难。然后,根据另一个建议,我应该在MySQL中存储一个varbinary字段。THX随机化是必要的,是的。但是仅仅一个盐可能是不够的,同样的原因,它不被认为是足够的密码。此外,还需要降低散列计算的速度,这就是为什么我考虑使用PBKDF2及其同事。