转向在区块链上确保 2FA 的安全

SMS 消息是最流行的双因素身份验证 (2FA) 方法。 它被银行、电子钱包、加密钱包、邮箱和各种服务使用; 方法使用率接近100%.

我对这种情况感到愤慨,因为这种方法不安全。 在移动时代之初,他们开始将号码从一张 SIM 卡重新分配到另一张 SIM 卡 - 这就是当 SIM 卡丢失时恢复号码的方法。 “数字货币盗窃专家”意识到“重写 SIM 卡”选项可用于欺诈计划。 毕竟谁控制了SIM卡,谁就可以控制别人的网上银行、电子钱包,甚至加密货币。 您还可以通过贿赂电信员工、使用欺骗或伪造文件来占有他人的号码。

转向在区块链上确保 2FA 的安全

数千起 SIM 卡交换事件已被揭露,这一诈骗计划被称为“SIM 卡交换”。 灾难的规模表明世界很快就会放弃通过短信实现的 2FA。 但这并没有发生 - 在 研究 他们说,选择2FA方法的不是用户,而是服务所有者。

我们建议使用安全的 2FA 方法,通过区块链传送一次性代码,我们将告诉您服务所有者如何连接它。

计数达到数百万

据伦敦警方称,2019 年 SIM 交换欺诈增加了 63%,攻击者的“平均账单”为 4,000 英镑。 我没有在俄罗斯找到任何统计数据,但我认为它们更糟。

SIM 交换被用来窃取流行的 Twitter、Instagram、Facebook、VK 帐户、银行帐户,最近甚至还窃取加密货币 - 《泰晤士报》报道 比特币企业家 Joby Weeks 表示。 自 2016 年以来,媒体不断报道利用 SIM 卡交换进行加密货币盗窃的备受瞩目的案件; 2019 年迎来了真正的高峰。

XNUMX 月,美国密歇根州东区检察官办公室 提出指控 九名年龄在 19 岁至 26 岁之间的年轻人:据信他们是一个名为“The Community”的黑客团伙的成员。 该团伙被指控进行了七次交换攻击,黑客窃取了价值超过 2,4 万美元的加密货币。 今年 10 月,加州学生 Joel Ortiz 因 SIM 卡交换被判 7.5 年监禁; 他生产了 XNUMX 万美元的加密货币。

转向在区块链上确保 2FA 的安全
乔尔·奥尔蒂斯在大学新闻发布会上的照片。 两年后,他因网络诈骗而被拘留。

SIM 卡交换的工作原理

“交换”就是交换的意思。 在所有此类计划中,犯罪分子通常通过重新发行 SIM 卡来获取受害者的电话号码,并用它来重置密码。 理论上,典型的 SIM 卡交换如下所示:

  1. 情报服务。 诈骗者会找出受害者的个人信息:姓名和电话号码。 它们可以在开源(社交网络、朋友)中找到,也可以从同谋(移动运营商的员工)处收到。
  2. 阻塞。 受害者的SIM卡已停用; 为此,只需致电提供商的技术支持,提供号码并说明手机丢失即可。
  3. 捕获号码,将其转移到您的 SIM 卡上。 通常,这也是通过电信公司的同谋或通过伪造文件来完成的。

在现实生活中,情况甚至更为严重。 攻击者选择一个受害者,然后每天跟踪手机的位置——一次请求接收用户已切换到漫游的信息的费用为 1-2 美分。 当SIM卡的主人出国后,他们就与通讯商店的经理协商发放新的SIM卡。 它的费用约为 50 美元(我找到了信息 - 在不同的国家和不同的运营商,从 20 美元到 100 美元不等),最坏的情况是经理将被解雇 - 对此没有任何责任。

现在,所有短信都会被攻击者收到,而手机的所有者将无法对此采取任何措施 - 他在国外。 然后,恶棍可以访问所有受害者的帐户,并根据需要更改密码。

返还被盗财产的机会

银行有时会向受害者妥协,并从他们的账户中提取转账。 因此,即使没有找到罪犯,也可以返还法定货币。 但有了加密货币钱包,一切就变得更加复杂——而且 技术上,并立法。 到目前为止,还没有一家交易所/钱包向交换受害者支付赔偿。

如果受害者想在法庭上捍卫自己的资金,他们就会责怪运营商:他为账户资金被盗创造了条件。 这正是我所做的 迈克尔·特平由于互换损失了224亿美元,他现在正在起诉电信公司AT&T。

转向在区块链上确保 2FA 的安全

到目前为止,还没有哪个州制定了合法保护加密货币所有者的工作计划。 您无法为您的资金投保或获得损失赔偿。 因此,防止交换攻击比处理其后果更容易。 最明显的方法是为 2FA 使用更可靠的“第二因素”。

SIM 交换并不是通过短信进行 2FA 的唯一问题

从技术角度来看,短信中的确认码也是不安全的。 由于 7 号信令系统 (SS7) 中未修补的漏洞,消息可能会被拦截。 SMS 上的 2FA 被官方认为是不安全的(美国国家标准与技术研究所在其报告中表示这一点) 数字认证指南).

同时,2FA的存在往往会给用户一种虚假的安全感,他会选择更简单的密码。 因此,这种身份验证不会增加难度,反而使攻击者更容易获得帐户的访问权限。

而且短信通常会延迟很长时间才能到达,或者根本不会到达。

其他 2FA 方法

当然,光芒并没有集中在智能手机和短信上。 2FA 还有其他方法。 例如,一次性 TAN 代码:一种原始方法,但它有效 - 一些银行仍在使用它。 有些系统使用生物识别数据:指纹、视网膜扫描。 就便利性、可靠性和价格而言,另一个似乎是合理折衷的选择是 2FA 的特殊应用程序:RSA 令牌、Google Authenticator。 还有物理按键等方法。

从理论上讲,一切看起来都是合乎逻辑且可靠的。 但在实践中,现代 2FA 解决方案存在问题,并且正因为这些问题,现实与预期有所不同。

根据 研究原则上,使用 2FA 会带来不便,而通过 SMS 进行的 2FA 的流行可以解释为“与其他方法相比,不便较少”——接收一次性代码对于用户来说是可以理解的。

用户将许多 2FA 方法与担心失去访问权限联系在一起。 物理钥匙或 TAN 密码列表可能会丢失或被盗。 我个人在使用 Google Authenticator 时有过不好的经历。 我的第一部装有此应用程序的智能手机坏了 - 感谢我为恢复帐户访问所做的努力。 另一个问题是切换到新设备。 由于安全原因,Google Authenticator 没有导出选项(如果可以导出密钥,那还有什么安全性?)。 有一次我手动携带钥匙,然后我决定将旧智能手机放在架子上的盒子里更容易。

2FA 方法应该是:

  • 安全 - 只有您而不是攻击者才能访问您的帐户
  • 可靠 - 您可以在需要时随时访问您的帐户
  • 方便且易于使用 - 使用 2FA 非常清晰且花费最少的时间
  • 便宜的

我们相信区块链是正确的解决方案。

在区块链上使用 2FA

对于用户来说,区块链上的 2FA 看起来与通过短信接收一次性代码相同。 唯一的区别是交付渠道。 获取 2FA 代码的方法取决于区块链提供的内容。 在我们的项目中(信息在我的个人资料中),这是一个 Web 应用程序、Tor、iOS、Android、Linux、Windows、MacOS。

该服务生成一次性代码并将其发送到区块链上的信使。 然后按照经典:用户在服务界面输入收到的代码并登录。

转向在区块链上确保 2FA 的安全

文章 去中心化信使如何在区块链上工作? 我写到区块链保证了消息传输的安全性和隐私性。 关于发送2FA代码的问题,我会强调:

  • 一键创建帐户 - 无需电话或电子邮件。
  • 所有带有 2FA 代码的消息均经过端到端 curve25519xsalsa20poly1305 加密。
  • 排除 MITM 攻击 - 每条带有 2FA 代码的消息都是区块链上的一笔交易,并由 Ed25519 EdDSA 签名。
  • 带有 2FA 代码的消息最终位于其自己的块中。 块的顺序和时间戳无法更正,因此消息的顺序也无法更正。
  • 没有中央结构来检查消息的“真实性”。 这是由基于共识的分布式节点系统完成的,并且由用户拥有。
  • 无法禁用 - 无法阻止帐户且无法删除消息。
  • 随时从任何设备访问 2FA 代码。
  • 使用 2FA 代码确认消息传递。 发送一次性密码的服务确信它已被传送。 没有“再次发送”按钮。

为了与其他一些2FA方法进行比较,我做了一个表格:

转向在区块链上确保 2FA 的安全

用户在区块链信使中收到一个帐户,即可在一秒钟内接收代码 - 只需使用密码即可登录。 因此,申请方法可能会有所不同:您可以使用一个帐户接收所有服务的代码,也可以为每项服务创建单独的帐户。

还有一个不便之处——账户必须至少有一笔交易。 为了让用户接收带有代码的加密消息,您需要知道他的公钥,并且它仅在第一笔交易时出现在区块链中。 这就是我们设法摆脱困境的方法:我们让他们有机会在钱包中接收免费代币。 然而,更好的解决方案是将帐户命名为公钥。 (为了比较,我们有一个帐号 U1467838112172792705 是公钥的衍生物 cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada。 对于信使来说,这更方便和可读,但对于发送 2FA 代码的系统来说,这是一个限制)。 我想,未来会有人做出这样的决定,把“方便、可达”搬到绿区。

发送 2FA 代码的价格非常低 - 0.001 ADM,现在是 0.00001 USD。 同样,你可以提高你的区块链并使价格为零。

如何将区块链上的 2FA 连接到您的服务

我希望我能够引起一些读者的兴趣,将区块链授权添加到他们的服务中。

我会以我们的Messenger为例告诉你如何做到这一点,以此类推,你可以使用另一个区块链。 在 2FA 演示应用程序中,我们使用 postgresql10 来存储帐户信息。

连接阶段:

  1. 在区块链上创建一个帐户,您将从中发送 2FA 代码。 您将收到一个密码,该密码用作私钥,用于使用代码加密消息并签署交易。
  2. 将脚本添加到您的服务器以生成 2FA 代码。 如果您已使用任何其他具有一次性密码传送的 2FA 方法,则您已完成此步骤。
  3. 将脚本添加到您的服务器,以将代码发送给区块链信使中的用户。
  4. 创建用于发送和输入 2FA 代码的用户界面。 如果您已使用任何其他具有一次性密码传送的 2FA 方法,则您已完成此步骤。

1 账户创建

在区块链中创建账户意味着生成私钥、公钥和派生账户地址。

转向在区块链上确保 2FA 的安全

首先,生成 BIP39 密码,并根据它计算 SHA-256 哈希值。 该哈希用于生成私钥ks和公钥kp。 根据公钥,使用相同的 SHA-256 进行反转,我们获得了区块链中的地址。

如果您想每次从新帐户发送 2FA 代码,则需要将帐户创建代码添加到服务器:

import Mnemonic from 'bitcore-mnemonic'
this.passphrase = new Mnemonic(Mnemonic.Words.ENGLISH).toString()

…

import * as bip39 from 'bip39'
import crypto from 'crypto'

adamant.createPassphraseHash = function (passphrase) {
  const seedHex = bip39.mnemonicToSeedSync(passphrase).toString('hex')
  return crypto.createHash('sha256').update(seedHex, 'hex').digest()
}

…

import sodium from 'sodium-browserify-tweetnacl'

adamant.makeKeypair = function (hash) {
  var keypair = sodium.crypto_sign_seed_keypair(hash)
  return {
    publicKey: keypair.publicKey,
    privateKey: keypair.secretKey
  }
}

…

import crypto from 'crypto'

adamant.getAddressFromPublicKey = function (publicKey) {
  const publicKeyHash = crypto.createHash('sha256').update(publicKey, 'hex').digest()
  const temp = Buffer.alloc(8)
  for (var i = 0; i < 8; i++) {
    temp[i] = publicKeyHash[7 - i]
  }
  return 'U' + bignum.fromBuffer(temp).toString()
}

在演示应用程序中,我们对其进行了简化 - 我们在 Web 应用程序中创建了一个帐户,并从中发送代码。 在大多数情况下,这对用户来说也更方便:他知道服务从特定帐户发送 2FA 代码并可以命名它。

转向在区块链上确保 2FA 的安全

2 生成2FA代码

必须为每个用户登录生成 2FA 代码。 我们使用图书馆 非法经营,但您可以选择任何其他一项。

const hotp = speakeasy.hotp({
  counter,
  secret: account.seSecretAscii,
});

检查用户输入的2FA代码的有效性:

se2faVerified = speakeasy.hotp.verify({
  counter: this.seCounter,
  secret: this.seSecretAscii,
  token: hotp,
});

3 发送 2FA 代码

您可以使用区块链节点API、JS API库或控制台提交2FA代码。 在此示例中,我们使用控制台 - 这是命令行界面,这是一个简化与区块链交互的实用程序。 要发送带有 2FA 代码的消息,您需要使用以下命令 send message 控制台。

const util = require('util');
const exec = util.promisify(require('child_process').exec);

…

const command = `adm send message ${adamantAddress} "2FA code: ${hotp}"`;
let { error, stdout, stderr } = await exec(command);

发送消息的另一种方法是使用以下方法 send 在 JS API 库中。

4 用户界面

需要为用户提供输入 2FA 代码的选项,这可以根据您的应用程序平台以不同的方式完成。 在我们的示例中,这是 Vue。

转向在区块链上确保 2FA 的安全

区块链双因素身份验证演示应用程序的源代码可以查看 GitHub上。 自述文件中有一个指向实时演示的链接,可以进行试用。

来源: habr.com

添加评论