主页 > imtoken官网下载教程 > 继互联网之后最具颠覆性的创新技术--区块链安全分析

继互联网之后最具颠覆性的创新技术--区块链安全分析

imtoken官网下载教程 2023-05-11 07:30:51

比特币区块链概念股_什么是比特币区块链视频_区块链起源于比特币a对b错

点击上方“百泽安全团队”订阅!

介绍

近年来,区块链呈现出井喷的速度,受到各行各业的青睐。 在证券市场、支付系统、票据与供应链金融、客户征信与反欺诈等应用场景中具有广阔的应用前景。 享有“继互联网之后最具颠覆性的创新技术”称号的区块链技术应用背后的安全问题成为不可忽视的重要一环。 这里简单介绍一下区块链,简单分析一下区块链问题可能存在的安全问题。

一、区块链简介

你知道区块链吗,它长什么样? 阅读以下文字,勾勒出你心中的印象! 区块链的起源、分类、特点、工作流程等方面都可以收获~

1.1 区块链的起源

自1983年D.Chaum发表第一篇电子现金论文以来,对电子现金的研究一直没有间断,直到2008年中本聪发表白皮书《一种新的电子现金系统》。只有在区块链的区块链上运行比特币,才能区块链进入大家的视野。

什么是比特币区块链视频_比特币区块链概念股_区块链起源于比特币a对b错

提到区块链,你会想到比特币、去中心化、智能合约、记账、中本聪等关键词吗? 简单来说,区块链是一种去中心化的分布式账本,是比特币的底层技术。

1.2 区块链的分类及特点

区块链可以根据不同的标签分为不同的类别。 大白这里分为三类,分别是公链(例如:比特币)、联盟链(例如:R3CEV)和私有链(例如:DAH)。

,下面重点对三类进行讲解。

1.2.1 分类:

区块链起源于比特币a对b错_比特币区块链概念股_什么是比特币区块链视频

公链:所有机器都在公网上,数量极其庞大,没有人可以控制这样的机器来达到个人目的。 比特币是公链的典型例子。

区块链起源于比特币a对b错_比特币区块链概念股_什么是比特币区块链视频

联盟链:多个预选节点被某个群体指定为记账人,每个区块的产生由所有预选节点共同决定(预选节点参与共识过程),其他接入节点可以参与交易区块链起源于比特币a对b错,但不询问 在记账过程中,任何人都可以通过区块链上开放的 API 进行有限的查询。

区块链起源于比特币a对b错_比特币区块链概念股_什么是比特币区块链视频

私有链:仅使用区块链的总账技术进行记账。 它可以是公司或个人,对区块链具有独占访问权。 该链与其他分布式存储解决方案没有太大区别。

1.2.2 特点:

接下来,我们来看看区块链有哪些特点? 大致有四个特点:分布式(去中心化)、匿名性(无需信任)、公开性(高度透明)、加密安全性(不可篡改)。

区块链起源于比特币a对b错_比特币区块链概念股_什么是比特币区块链视频

特点1 去中心化:即所有交易都是点对点的,没有任何信用中介或集中清算机构;

区块链起源于比特币a对b错_比特币区块链概念股_什么是比特币区块链视频

特点2 无需信任:任意两个节点之间的数据交换无需相互信任,完全依赖区块链中的交易历史和数据溯源,以及共识机制来保证正确且不可逆的执行数据交换。

区块链起源于比特币a对b错_比特币区块链概念股_什么是比特币区块链视频

特点3 开放性:整个区块链网络中的数据公开透明,每个节点(参与者)都可以自由加入网络和下载所有数据。

区块链起源于比特币a对b错_比特币区块链概念股_什么是比特币区块链视频

特点4 加密安全:类似于目前银行网银系统(尤其是企业网银系统)的加密机制,在区块链的数据结构和交易过程中,大量的公钥和私钥用于加密和解密以确保数据安全。 基于这个技术基础,甚至可以应用群签名来保证共享数据的安全。 此外,区块链采用单向哈希算法,每一个新生成的区块都按照严格的时间线性顺序推进。 时间的不可逆性使得任何试图侵入和篡改区块链中的数据信息的行为都容易被追踪,从而导致被其他节点排除在外,从而可以限制相关的不当行为。

1.3 区块链工作流程

了解了区块链的起源、分类和特点后,是不是有进一步操作的冲动? 下面对区块链的工作流程进行介绍,以便泽友更全面的掌握。

1、首先,客户端发起交易后,会向网络广播,等待确认;

2、网络中的节点检查接收到的数据记录信息,如记录信息是否合法。 审核通过后,数据记录将包含在一个区块中;

3、全网所有接收节点对区块执行共识算法(工作量证明PoW、权益证明PoS等);

4. 区块通过共识算法流程后,正式纳入区块链存储,全网所有节点均表示接受该区块。 表示接受的方式是将区块的随机哈希值作为最新的区块哈希值,新区块的制造将基于区块链进行扩展。

区块链起源于比特币a对b错_什么是比特币区块链视频_比特币区块链概念股

2. 区块链结构

早些时候,我们对区块链有了初步的了解,但是好像不是很清楚,blockchain blockchain blockchain blockchain? 它是如何形成的? 看名字,猜一猜。 区块链是块和链。

2.1 积木

比特币区块链概念股_区块链起源于比特币a对b错_什么是比特币区块链视频

区块是一段时间内发生的交易和状态的记录。 这是对当前账本状态的共识。 它由一个包含元数据的块头和随后构成块主体的一长串交易组成。 区块头80字节,平均每笔交易至少250字节,每个区块平均至少包含500多笔交易。

什么是比特币区块链视频_区块链起源于比特币a对b错_比特币区块链概念股

下一个区块头的最大哈希值=最后三个字节(难度目标)*2^(8*(第一个字节(难度目标)-3))

挖矿难度=创世区块链下一个区块头的最大哈希值/下一个区块头的最大哈希值

比特币地址=*1*+Base58(0+公钥hash160+前四个字节(hash256(0+公钥hash160)))

hash160(x)=Ripemd160(sha256(x))

Ripemd160原始完整性校验报文摘要是基于md的,所以添加数据的方法和md5完全一样。

每个块都有一个块标识符。 区块标识符包括区块头哈希值(区块主标识符)和区块高度。 区块头哈希值可以唯一清晰地标识一个区块,任何节点都可以通过简单地对区块头进行哈希处理,独立获得区块头哈希值。 区块头哈希实际上并不包含在区块的数据结构中,无论是在区块在网络上传输时,还是作为区块链的一部分存储在节点的永久存储设备上时。 当从网络接收到块时,块头哈希由每个节点计算。 块散列可以作为块元数据的一部分存储在单独的数据库表中,以便更容易索引和更快地从磁盘检索块。

区块高度是另一种通过区块在区块链中的位置来识别区块的方式。 第一个区块的高度为 0,存储在第一个区块之上的每个后续区块在区块链中都比前一个区块“更高”,就像盒子一个接一个地堆叠在其他箱子的顶部。 与区块头哈希值不同,区块高度不是唯一标识。 在区块链的成长过程中,两个或多个区块可能具有相同的高度。 这种情况称为“区块链分叉”

2.2 区块链

当节点从网络接收到传入块时,它会验证这些块,然后链接到现有区块链以形成以下区块链:

区块链起源于比特币a对b错_比特币区块链概念股_什么是比特币区块链视频

怎么肿了? 朋友们,区块链真的是由区块和区块链组成的吗? 但是区块还包含其他元素,比如区块头、区块高度等,相信看完上面的你就知道了!

3. 区块链安全

区块链技术之所以如此受欢迎,是因为其安全特性对其起到了一定的推动作用。 每个人都认为区块链非常安全,几乎坚不可摧。 区块链虽然采用工作量证明等共识机制解决拜占庭一般问题,防止恶意攻击,但也采用公私钥加解密、ECDSA签名、数字证书等方式生成每个用户的地址(用于例如:比特币钱包)保护您的交易。 但是,它的交易数据是完全透明的,默认情况下是不加密的。 下面看一下生成比特币公私钥、地址、签名等的具体代码实现。

比特币使用的HASH160和HASH256哈希算法

#define HASH256_SIZE (32)

#define HASH160_SIZE (20)

size_t Hash256(const unsigned char * begin, size_t size, unsigned char to[])

{

无符号字符散列[HASH256_SIZE];

如果(NULL == 开始 || 大小 == 0)返回 0;

SHA256(开始,大小,(unsigned char *)&hash[0]);

SHA256(&hash[0], sizeof hash, (unsigned char *)&to[0]);

返回 HASH256_SIZE;

}

size_t Hash160(const unsigned char * begin, size_t size, unsigned char to[])

{

无符号字符散列[HASH256_SIZE];

如果(NULL == 开始 || 大小 == 0)返回 0;

SHA256(开始,大小,(unsigned char *)&hash[0]);

RIPEMD160(&hash[0], sizeof hash, &to[0]);

返回 HASH160_SIZE;

}

比特币私钥是一串 256 位的随机数,取值范围为 [1,n-1]

其中 n(顺序)= FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141

BOOL ECKey_Check(const unsigned char vch[32]);

uint32_t ECKey_GeneratePrivKey(EC_KEY * pkey, unsigned char vch[32])

比特币区块链概念股_什么是比特币区块链视频_区块链起源于比特币a对b错

{

兰德种子(); // 初始化随机数种子

{

RAND_bytes(vch, 32); // 使用openssl库生成一个256位的随机数

}while(!ECKey_Check(vch)); // 检查取值范围是否合法

如果(pkey!= NULL)返回 ECKey_GenKeypair(pkey,vch); // 生成密钥对

返回 32; // 私钥的字节数

}

BOOL ECKey_Check(const unsigned char vch[32])

{

static const unsigned char 命令[32] = {

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,

0xBA、0xAE、0xDC、0xE6、0xAF、0x48、0xA0、0x3B、

0xBF、0xD2、0x5E、0x8C、0xD0、0x36、0x41、0x40

};

BIGNUM 亿; // 私钥

BIGNUM bn订单; // Fp下G的序号顺序

BIGNUM bn0; // 0

BN_init(&bn);

BN_init(&bnOrder);

BN_init(&bn0);

BN_zero(&bn0);

BN_bin2bn(vch, 32, &bn); //将二进制序列转化为大整数

BN_bin2bn(order, 32, &bnOrder);

//** 0 < [私钥] < 顺序

如果(BN_is_zero(&bn))返回 0; // 私钥不能为0

如果(BN_cmp(&bn, &bnOrder) > 0) 返回 0; //私钥必须小于order

返回 1;

}

生成公钥如下:

//** 初始化EC_KEY,告诉openssl库使用secp256k1椭圆曲线。

EC_KEY * ECKey_new()

{

返回 EC_KEY_new_by_curve_name(NID_secp256k1);

}

uint32_t ECKey_GenKeypair(EC_KEY * pkey, unsigned char vch[HASH256_SIZE])

比特币区块链概念股_什么是比特币区块链视频_区块链起源于比特币a对b错

{

//** pkey = ECKey_new();

const uint32_t key_size = HASH256_SIZE;

常量 EC_GROUP * 组;

BIGNUM 亿;

BIGNUM * 私钥 = &bn;

BN_CTX * ctx = NULL;

EC_POINT *pubkey = NULL;

如果(NULL == pkey)返回 0;

BN_init(&bn); // BIGNUM使用前最好先初始化,否则在windows+mingw环境下有时会出错

group = EC_KEY_get0_group(pkey); // G值和操作规则存储在组结构中

pubkey = EC_POINT_new(组); // 给pubkey分配内存,pubkey是曲线上的一个点

ctx = BN_CTX_new();

如果(NULL == pubkey || NULL == ctx)转到label_errexit;

if(BN_bin2bn(vch, key_size, &bn)) // 将私钥(二进制形式)转换为一个大整数

{

if(EC_POINT_mul(group, pubkey, privkey, NULL, NULL, ctx)) // pubkey =privkey*G

{

// 将key存放在EC_KEY结构中,方便导出为需要的格式

EC_KEY_set_private_key(pkey, privkey);

EC_KEY_set_public_key(pkey, pubkey);

}

BN_clear_free(&bn);

}

EC_POINT_free(公钥);

BN_CTX_free(ctx);

返回键大小;

标签错误退出:

如果(NULL!=pubkey)EC_POINT_free(pubkey);

如果(NULL!= ctx)BN_CTX_free(ctx);

返回 0;

}

Base58check编码生成比特币地址如下:

uint32_t PubkeyToAddr(const unsigned char * pubkey, size_t size, char *to)

{

结构体

{

无符号字符版本;

比特币区块链概念股_区块链起源于比特币a对b错_什么是比特币区块链视频

无符号字符 vch[20];

无符号字符校验和[4];

}ext_pubkey;

无符号字符散列[32]={0};

printf("ext_pubkey 大小: %d\n", sizeof(ext_pubkey));

ext_pubkey.version = 0x00;

Hash160(pubkey, size, &ext_pubkey.vch[0]);

Hash256(&ext_pubkey.version, 1+20, hash);

memcpy(ext_pubkey.checksum, hash, 4);

返回 Base58Encode((unsigned char *)&ext_pubkey.version, sizeof(ext_pubkey), to);

签名如下:

size_t ECKey_Sign(EC_KEY *pkey, const unsigned char hash[HASH256_SIZE], unsigned char **to)

{

//** 如果 (*to) == NULL,调用者应该使用 OPENSSL_free(*to) 来释放内存

size_t cb = 0;

ECDSA_SIG *sig = NULL;

BN_CTX * ctx = NULL;

大订单; // G的顺序

BIGNUM 半阶; // 获取有符号/无符号标记

无符号字符 *output = NULL;

const EC_GROUP * group = EC_KEY_get0_group(pkey); // secp256k1: G

如果(NULL == 组)返回 0;

sig = ECDSA_do_sign((unsigned char *)&hash[0], HASH256_SIZE, pkey);

如果(NULL == sig)返回 0;

//** 信号 = (r,s) = (r,-s)

//** s 必须小于 order/2,否则,某些应用程序可能会将 '-s' 解析为一个大的无符号正整数

ctx = BN_CTX_new();

如果(NULL == ctx)转到label_exit;

//** 为 bignum 分配内存

BN_init(&order);

BN_init(&halford);

//获取G的顺序

EC_GROUP_get_order(group, &order, ctx); // secp256k1: n

BN_rshift1(&halford, &order);

如果(BN_cmp(信号->s,&halford)>0)

{

// 如果 s > order/2,则输出 -s。 (-s = (顺序 - s))

BN_sub(sig->s, &order, sig->s);

区块链起源于比特币a对b错_比特币区块链概念股_什么是比特币区块链视频

}

BN_CTX_free(ctx);

输出= *到;

cb = ECDSA_size(pkey);

如果(NULL == 输出)

{

输出 = (unsigned char *)OPENSSL_malloc(cb);

如果(NULL == 输出)转到 label_exit;

}

如果(NULL == *to)*to =输出;

//** i2d_ECDSA_SIG DER 编码 ECDSA_SIG 对象的内容

//**(注意:此函数修改*pp(*pp += DER 编码签名的长度))。

//** 不要直接传递'to'的地址

cb = i2d_ECDSA_SIG(sig, &output);

标签出口:

ECDSA_SIG_free(sig);

返回 cb;

}

可以看出,上述区块链采用了目前非常主流的加密、签名等方案来保证其安全性,但无论系统多么安全区块链起源于比特币a对b错,都会存在安全问题。 下面从几个方面分析区块链可能存在的安全问题。

3.1 密钥安全

密码学技术是区块链的核心技术之一,保证了区块链不可逆、不可伪造。 因此,区块链也存在密码学中秘钥的存储、传输等安全风险。 区块链不存在第三方,​​私钥由每个用户保管(比特币采用冷库进行离线存储)。 如果用户的存储设备感染病毒,则私钥可能会丢失。 一旦私钥丢失,用户就相当于失去了对自己数据或资产的控制权。 由于区块链的去中心化特性,没有私钥补发和管理机制,因此私钥一旦丢失,将无法找回。

3.2 隐私保护

区块链的隐私保护也存在安全隐患。 一个区块的数据包含了所有的交易记录和账户身份信息。 交易信息在区块链中公开,账户身份信息采用非对称加密算法加密。 每个人都可以得到它,所以如果交易信息具有一定的敏感性,那么就存在一定的风险。 此外,区块链系统中的每个节点都不是完全匿名的,而是通过类似于电子邮件地址的地址标识(如比特币公钥地址)实现数据传输。 虽然地址标识与现实世界中人的身份没有直接关系,但区块链数据是完全公开透明的。 随着各种反匿名识别技术和大数据技术的发展,一些关键点可能会通过数据整合和分析来实现。 目标位置和识别。

3.3 拒绝服务

很多人看到区块链去中心化的特点时,认为区块链在处理拒绝服务方面比现有的中心化系统有一定的优势,会更加灵活、点对点、冗余。 其中一个节点遭受拒绝服务攻击不会影响整个系统。 但是,如果没有合适的协调控制机制,当一个节点受到攻击时,虽然整个系统不会受到影响,但连接到该节点的用户将无法进行相应的操作。

另外,如果区块链客户端存在安全漏洞,也会出现类似现在手机APP的拒绝服务问题。 类似的事件还有以太坊钱包Geth客户端的崩溃,以及以太坊(ETH)交易市场的临时恐慌性抛售事件。 和分叉的以太坊 (ETH) DDoS 攻击。

3.4 针对技术的攻击

每个系统的设计和实现都会有缺陷。 即使设计是安全的,在代码实现上也会存在一定的风险。 DAO被攻击主要是代码实现的问题。 从技术角度分析针对THE DAO的攻击方式。 首先,DAO余额扣除和以太币转账这两个步骤的顺序是错误的。 其次,未知代码不受限制地执行,为攻击提供了可能性。 此外,Bitfinex 多重签名攻击是由于两个平台之间的相互信任。 其中一个平台被黑后,被攻击平台发送的请求被另一个平台认为是合法的,从而破坏了多重签名的安全性。

Bitfinex 多重签名攻击

公开资料显示,bitfinex平台保存用户资产的方式与其他平台不同。 其他平台一般将大部分币存放在冷库中(离线且不联网),只将一小部分币存放在热钱包(在线)中供用户提现。 为了安全,bitfinex还与Bitgo(比特币安全平台)合作,对每个用户的币种进行多重签名处理。 多重签名是指当Bitfinex用户想要提取比特币时,Bitfinex平台会先确认一次,然后再通知Bitgo进行确认。 因为Bitfinex平台希望做到资金透明,每个用户的币独立存储(100%储备,资金流向清晰),每个用户使用不同的多重签名地址,每个用户的提现操作需要经过Bitfinex和Bitgo两家公司证实。 每个用户的币是分开存放的,所以我们看到了“部分用户的币被盗”的公告。

错误在于Bitfinex和Bitgo的多重签名安全方案必须自动处理,所有用户的多重签名地址必须在线处理。 Bitgo必须假设Bitfinex服务器是安全的才能工作,Bitgo没有义务保证Bitfinex服务器请求的合法性。 只要是Bitfinex服务器发起的提款请求,Bitgo都可能通过。 这样,当Bitfinex服务器被黑,直接在Bitfinex服务器上发起取款请求时,Bitgo会将币发出。

虚拟货币被黑客攻击的事件越来越多。 虽然攻击可能是由系统其他部分的风险引起的,但区块链的特性也导致系统的实现与安全存在一定的冲突。

四。 概括

前面已经介绍了区块链的接受度、组成和安全性,这里是时候总结一下了~ 区块链技术已经在一些场景(慈善、支付网络、金融交易等)应用到现实生活中。 然而,区块链不仅像比特币一样存在51%攻击和性能问题,在加密技术、密钥存储、隐私保护、技术实现等方面也存在安全隐患,这将成为其发展面临的重大挑战之一。

5. 参考资料

至此,区块链的介绍就告一段落了。 泽友们要了解区块链,了解区块链可能存在的安全问题。 大白和泽友下次再见~

结尾

如果您对互联网金融安全有任何疑问,欢迎留言,我们无所不知,畅谈不绝~

关注百泽安全团队,互金安全你掌握

什么是比特币区块链视频_区块链起源于比特币a对b错_比特币区块链概念股