Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 如何分离一个人';从他的个人资料中可以看出他的身份?_Hash_Database Security_Sensitive Data - Fatal编程技术网

Hash 如何分离一个人';从他的个人资料中可以看出他的身份?

Hash 如何分离一个人';从他的个人资料中可以看出他的身份?,hash,database-security,sensitive-data,Hash,Database Security,Sensitive Data,我正在写一个应用程序,主要目的是保存用户列表 购买 我想确保,即使我是一名开发人员(或任何拥有完整 访问数据库)无法计算出一张支票的金额 特定的人已经花费或他买了什么 我最初提出了以下方案: --------------+------------+----------- user_hash | item | price --------------+------------+----------- a45cd654fe810 | Strip club

我正在写一个应用程序,主要目的是保存用户列表 购买

我想确保,即使我是一名开发人员(或任何拥有完整 访问数据库)无法计算出一张支票的金额 特定的人已经花费或他买了什么

我最初提出了以下方案:

--------------+------------+----------- user_hash | item | price --------------+------------+----------- a45cd654fe810 | Strip club | 400.00 a45cd654fe810 | Ferrari | 1510800.00 54da2241211c2 | Beer | 5.00 54da2241211c2 | iPhone | 399.00 --------------+------------+----------- 用户|散列|项目|价格 --------------+------------+----------- a45cd654fe810脱衣舞俱乐部400.00 a45cd654fe810 |法拉利| 1510800.00 54da2241211c2 |啤酒| 5.00 54da2241211c2 | iPhone | 399.00
  • 用户使用用户名和密码登录
  • 从密码中计算
    用户\u散列值
    (可能带有盐渍等)
  • 使用散列访问具有普通SQL查询的用户数据
如果有足够的用户,几乎不可能知道有多少 一个特定的用户仅仅知道他的名字就花了钱


这样做是明智之举,还是我完全愚蠢?

我担心,如果你的应用程序可以将一个人链接到它的数据,任何开发人员/管理员都可以

你唯一能做的就是让链接变得更难,让开发者/管理员的速度变慢,但是如果你让用户链接到数据变得更难,那么你的服务器也会变得更难


基于“无想法”的想法:

您可以使用经典的用户/密码登录到您的应用程序(散列密码或其他什么),并使用特殊的“通行证”来确保数据的安全。此“通行证”不会存储在数据库中

当您的客户登录您的应用程序时,我必须提供用户/密码/通行证。通过数据库检查用户/密码,密码将用于加载/写入数据

当您需要写入数据时,可以对“username/pass”对进行散列,并将其存储为将客户机链接到数据的密钥

当您需要加载数据时,可以对“username/pass”对进行散列,并加载与此散列匹配的所有数据

这样就不可能在数据和用户之间建立链接

另一方面,(正如我在对@no的评论中所说)小心碰撞。另外,如果你的用户写了一个错误的“通行证”,你不能检查它



更新:关于最后一部分,我有另一个想法,你可以在你的数据库中存储你的“通行证/密码”组合的散列,这样你可以检查你的“通行证”是否正常。

问题是,如果有人已经完全访问了数据库,那么他们将记录链接到特定的人只是时间问题。在数据库的某个地方(或应用程序本身),您必须建立用户和项目之间的关系。如果有人拥有完全访问权限,那么他们将可以访问该机制

这是绝对无法阻止的

现实是,通过充分接触,我们处于信任的地位。这意味着公司经理必须相信,即使你能看到数据,你也不会以任何方式对其采取行动。这就是像道德这样的小事发挥作用的地方

现在,也就是说,许多公司将开发和生产人员分开。其目的是避免开发人员直接接触实时(即:真实)数据。这有许多优点,安全性和数据可靠性处于堆的顶端

唯一真正的缺点是,一些开发人员认为,如果没有生产访问权限,他们无法解决问题。然而,这根本不是事实

届时,只有生产人员可以访问实时服务器。他们通常会受到更大程度的审查(犯罪史和其他背景调查),这与您必须保护的数据类型有关

关键是这是人的问题,;而不是一个真正可以用技术手段解决的问题


更新

这里的其他人似乎错过了一个非常重要和重要的谜题。也就是说,数据输入系统是有原因的。这一理由几乎是普遍的,因此可以分享。在费用报告的情况下,输入该数据,以便会计可以知道谁要偿还

这意味着在某种程度上,系统必须在数据输入人员(即销售人员)未登录的情况下匹配用户和项目

由于数据必须绑定在一起,而不需要所有相关方都站在那里输入安全代码来“释放”数据,因此DBA绝对能够查看查询日志以确定谁是谁。我可以很容易地添加,不管你想在其中添加多少散列标记。三重DES也救不了你

归根结底,您所做的一切都是让开发变得更加困难,而绝对没有任何安全好处。这一点我再怎么强调也不过分:对dba隐藏数据的唯一方法是1。只有输入数据的人才能访问该数据。因为它本来就不存在


关于选项1,如果唯一能够访问它的人是输入它的人。。好吧,它在公司数据库中没有任何意义。

事实上,有一种方法你可以做到你所说的

您可以让用户在一个表单中键入他的姓名和密码,该表单运行一个纯客户端脚本,该脚本根据姓名和密码生成一个哈希。该散列用作用户的唯一id,并发送到服务器。这样,服务器只通过散列而不是名称来了解用户

不过,要使其正常工作,散列必须与普通密码散列不同,并且用户需要在服务器拥有该用户购买的任何“内存”之前再输入一次他们的姓名/密码

那个
// From http://baagoe.com/en/RandomMusings/javascript/
// Johannes Baagoe <baagoe@baagoe.com>, 2010
function Mash() {
  var n = 0xefc8249d;

  var mash = function(data) {
    data = data.toString();
    for (var i = 0; i < data.length; i++) {
      n += data.charCodeAt(i);
      var h = 0.02519603282416938 * n;
      n = h >>> 0;
      h -= n;
      h *= n;
      n = h >>> 0;
      h -= n;
      n += h * 0x100000000; // 2^32
    }
    return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
  };

  mash.version = 'Mash 0.9';
  return mash;
}