我正在寻找存储(在mySQL中)电话号码的混淆版本,其中该号码用于验证(我需要能够取回原始号码)。
我已经考虑过任意方案,例如存储数字* 15或某些常数,只有我的应用知道。
有什么更好的方法可以做到这一点?
编辑:我想澄清一些事情:
保存的电话号码可用于登录iPhone应用程序 - 因此我希望用户能够查看他们已连接到服务的号码,以便他们想要使用不同的登录应用程序数字稍后。这意味着我无法对值进行散列。
基本上我正在寻找一种方法来保护数据,如果有人抬起我的数据库,他们没有一堆原始形式的电话号码。所以我想对它们进行模糊处理,以便我可以使用它们进行身份验证,但是能够以原始形式恢复原状,而不会将其原始存储。
编辑:为了澄清,我没有在 JUST 电话号码上进行身份验证。如果实施,它将是电话号码+密码!输入可能存在的单个数字字符串,您在哪里?大声笑 - 如果我误导了一些人,我道歉。
答案 0 :(得分:6)
存放在哪里?在数据库中?使用加密功能而不是滚动自己的系统。
在MySQL中它就像:
一样简单INSERT INTO users (phone) VALUES (AES_ENCRYPT('yourkey', '867-5309'));
当然,现在你把问题从隐藏电话号码改为“@ $ @#$ @#我可以隐藏这个键吗?”。明显的解决方案:将钥匙隐藏在服务器前门外的岩石下面。这将问题变成了“@ @ @#$ @ @ @%@我可以隐藏这块石头的地方?”。明显的解决方案:用一个钢制笼子盖住你的前院,门上有挂锁。新问题:如何隐藏挂锁键......依此类推。
答案 1 :(得分:2)
实际加密怎么样?在这种情况下,一个好的对称加密算法是微不足道的,因为有效载荷的长度限制为10位数,所以你可以用一个也是10位十进制数的密钥来获得;使用这样的键,你需要做的就是每个数字上的XOR或增量/ mod 10。当然,这个方案中的薄弱环节就是你存储密钥的方式。
但是,我很好奇,为什么你需要让它们退出 - 如果它是用于身份验证:
答案 2 :(得分:1)
使用Cipher Class可以执行此操作:
$phone = '...';
$key = 'secret.for.each.number';
$phone = Cipher::encrypt($phone, $key);
将它存储在数据库中之前。然后你可以将它拉出来并执行此操作:
$phone = Cipher::decrypt($phone, $key);
答案 3 :(得分:0)
更好的方法是不这样做。有one-way encryption用于存储密码的原因。
如果您需要取回原始值,则不应将其用于身份验证,因为攻击者总是很容易找到它。
如果您觉得需要通过混淆隐藏价值,您可能需要更改有关如何存储数据的基本信息。
答案 4 :(得分:0)
这不是一个非常好的安全方法。我突然想到几件事:
电话号码很容易猜到:只需编程即可开始猜测随机组合。加密与否,您的程序正在使用这些数字进行验证,因此它最终会对某些数字起作用。您需要额外的安全层,例如只有相关用户知道的密码。我也会推荐反蛮力攻击措施。
任何双向加密都可以破解,就这么简单。如果您需要能够轻松地解密数据库中的数据,那么加密它的唯一好处就是有人侵入您的数据库并抓取信息。正如其他人所指出的那样,如果发生这种情况,你会遇到更大问题。另一种情况是可以有效访问数据库的员工。如果要隐藏数据,则必须以某种方式对信息进行编码。但是将电话号码乘以“未知”常数并不理想。使用更好的方法。
当然我知道我朋友的号码,所以我可以入侵任何人的帐号,对吗?如果尚未添加密码组件,则需要添加密码组件。密码应使用强大而独特的SALT进行单向加密。添加后,如果您不希望您的工作人员看到它们,您只需要加密数据库中的电话号码。否则你就是在浪费时间来加密它们。
答案 5 :(得分:-1)
这个问题没有意义。
请保留这些电话号码。你不会从这种混淆中获得任何安全性改进