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