PHP-寻找一种用于存储电话号码的双向模糊处理方法

PHP-寻找一种用于存储电话号码的双向模糊处理方法,php,obfuscation,Php,Obfuscation,我希望(在mySQL中)存储一个模糊版本的电话号码,该号码用于身份验证(我需要能够恢复原始号码) 我考虑过一种任意的方案,比如存储数字*15或只有我的应用程序知道的常数 有什么更好的方法可以做到这一点 编辑:我想澄清一些事情: 保存的电话号码可用于登录iPhone应用程序,因此我希望用户能够看到他们已连接到该服务的号码,以防以后想使用其他号码登录该应用程序。这意味着我不能散列该值 本质上,我正在寻找一种方法来保护数据,如果有人提起我的数据库,他们没有一堆原始形式的电话号码。所以我想对它们进行模糊

我希望(在mySQL中)存储一个模糊版本的电话号码,该号码用于身份验证(我需要能够恢复原始号码)

我考虑过一种任意的方案,比如存储数字*15或只有我的应用程序知道的常数

有什么更好的方法可以做到这一点

编辑:我想澄清一些事情:

  • 保存的电话号码可用于登录iPhone应用程序,因此我希望用户能够看到他们已连接到该服务的号码,以防以后想使用其他号码登录该应用程序。这意味着我不能散列该值

  • 本质上,我正在寻找一种方法来保护数据,如果有人提起我的数据库,他们没有一堆原始形式的电话号码。所以我想对它们进行模糊处理,这样我就可以使用它们进行身份验证,但可以在不原始存储的情况下将其恢复为原始形式


  • 编辑:澄清一下,我不是在验证电话号码。如果实现,它将是电话号码+密码!输入一个可能存在的数字字符串,您是否在?哈哈-如果我误导了一些人,我很抱歉。

    商店在哪里?在数据库中?使用加密功能,而不是滚动您自己的系统

    在MySQL中,它将非常简单:

    INSERT INTO users (phone) VALUES (AES_ENCRYPT('yourkey', '867-5309'));
    

    当然,现在您将问题从隐藏电话号码改为“我可以在哪里隐藏这把钥匙?”。显而易见的解决方案:把钥匙藏在服务器前门外面的石头下面。这就把问题变成了“我能把这块石头藏在哪里?”。显而易见的解决办法是:用一个门上有挂锁的钢笼子盖住前院。新问题:如何隐藏挂锁钥匙。。。诸如此类。

    更好的方法是不这样做。有一个原因是用来存储密码

    如果需要恢复原始值,则不应将其用于身份验证,因为攻击者总是很容易找到它


    如果您觉得需要通过混淆来隐藏该值,则可能需要更改有关存储数据的基本方式。

    实际加密如何?在这种情况下,一个好的对称加密算法是微不足道的,因为有效负载的长度被限制在10位以内,所以你可以使用一个同样是10位小数的密钥;使用这样一个键,您只需在每个数字上执行类似XOR或increment/mod 10的操作。当然,这个方案中的薄弱环节是存储密钥的方式

    但是,我很好奇,如果是为了身份验证,为什么需要将它们取回:

  • 你不应该使用电话号码,因为这些号码很容易查找,甚至是自动查找
  • 你应该用单独的盐来存储安全的单向散列,所以如果你想的话,你甚至不能自己把它们取出来(除非通过暴力强制)
  • 使用,您可以执行以下操作:

    $phone = '...';
    $key = 'secret.for.each.number';
    $phone = Cipher::encrypt($phone, $key);
    
    在将其存储到数据库之前。然后,您可以将其拔出并执行以下操作:

    $phone = Cipher::decrypt($phone, $key);
    

    这个问题没有意义


    把这些电话号码保持原样就行了。您不会从这种混淆中获得任何安全性改进

    这不是一种很好的安全性方法。有几件事突然向我袭来:

  • 电话号码很容易猜:只需编写一些程序,就可以开始猜随机组合。无论加密与否,您的程序都在使用这些数字进行验证,因此它最终会在某些情况下工作。您需要一个额外的安全层,比如只有相关用户才知道的密码。我还建议采取反暴力攻击措施

  • 任何双向加密都可以破解,就这么简单。如果您需要能够轻松地解密数据库中的数据,加密数据的唯一好处是有人入侵您的数据库并获取信息。正如其他人指出的那样,如果发生这种情况,你会遇到更大的问题。另一种情况是,员工可以有效访问数据库。如果要对他们隐藏数据,则以某种方式对信息进行编码很重要。但将电话号码乘以“未知”常数并不理想。使用更好的方法

  • 我当然知道我朋友的号码,所以我可以侵入任何人的帐户,对吗?如果尚未添加密码组件,则需要添加密码组件。密码应该是使用强且唯一的SALT的单向加密。添加后,如果不想让员工看到,只需在DB中加密电话号码。否则你就是在浪费时间加密它们


  • 听起来你想对它进行加密,而不是混淆它不会存储数字
    *10
    只会导致相同的数字在结尾处有一个额外的
    0
    :P@PeeHaa抱歉,我想另一个常量更有意义:Punless您的数据库是不安全的,将它们存储在加密的ads中几乎没有真正的安全性。@mfonda现在我在PHP中使用一个加密函数,它不会一直为相同的输入生成相同的输出。这意味着,当我存储它时,我将无法根据使用相同函数生成的值对用户进行身份验证。你可以根据每个用户的一些信息为他们生成不同的密钥。从“我需要能够获取原始号码”这篇文章中,我的观点是,听起来你正在走一条危险的道路。如果您需要取回该值,那么对于身份验证密钥来说,这不是一个好的选择,因为攻击者总是很容易找到它?混淆数字与只拥有原始电话号码相比,难道不会增加什么吗?如果有人可以窃取数据库,你会遇到更大的问题。我必须在这里根据结果值进行身份验证-此函数每次在同一输入上返回不同的值。它不应该。记住,您的
    $key