内容简介:WeIdentity 的多签及限量凭证的实现本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
WeIdentity 的多签及限量凭证的实现
注:本文为「上海对外经贸大大学区块链技术与应用研究中心」获「BSN 第二次开发者大赛一等奖」的作品的详述
Github 地址:
https://github.com/SUIBE-Blockchain/WeIdentity-Smart-Contract2.0
本文档描述的合约均适用于:
FISCO BCOS / CITA。
0. 项目特性
-
智能合约创意新颖、设计巧妙和通用性强
WeIdentity 方案基于 Solidity 编写,适用于许多需要数字身份的场景,如教育、金融等。
本项目写的多签方案与 CredentialController 同理。
其中,CredentialController 为独立模块,因此不仅适用于 WeIdentity 方案,也适用于其它基于 Solidity 的 DID 方案。
-
智能合约函数、事件、结构等设计规范性、合理性、执行效率与安全性
本项目遵循 Solidity 开发规范,且每一个新增函数均包含测试,符合 TDD 原则。
-
代码编写简洁规范、可读性强,注释清晰准确
保证每一个函数均有标准注释,且变量命名清晰规范,具有高可读性。
-
设计说明文档规范、结构完整、内容详细准确
设计文档完整,包括其实现功能、结构设计、流程设计、使用演示与未来规划。
-
多底层框架版本
不仅适用于 FISCO BCOS,还适用于 CITA 等使用 EVM 的联盟链。
1. WeIdentity 介绍
WeIdentity是一套分布式多中心的技术解决方案,可承载实体对象(人或者物)的现实身份与链上身份的可信映射、以及实现实体对象之间安全的访问授权与数据交换。WeIdentity由微众银行自主研发并完全开源,秉承公众联盟链整合资源、交换价值、服务公众的理念,致力于成为链接多个垂直行业领域的分布式商业基础设施,促进泛行业、跨机构、跨地域间的身份认证和数据合作。
目前主要包括两大模块:**WeIdentity DID 以及 WeIdentity Credential,**一个是去中心化身份,另一个是链上凭证。
WeIdentity 使用 Solidity 进行合约开发,主要包括以下两个部分:
- WeIdentity DID智能合约 ,负责链上 ID 体系建立,具体包括生成 DID(Distributed IDentity)、生成 DID Document、DID 在链上的读取与更新。
- WeIdentity Authority智能合约 ,负责进行联盟链权限管理,具体包括链上 DID 角色的定义、操作与权限的定义与控制。
2. WeIdentity 升级点
要讲 WeIdentity 合约使用于正式生产环境,还有一些地方需要升级。
- 权限控制方向
目前 WeIdentity 合约的权限控制方案:
在实际生产环境中, 我们需要包括多签功能的更精准的权限控制。
在进行修改后,权限控制方案如下:
| 操作 | 一般DID | Authority Issuer | Commitee Member | Administrator | | :---------------------: | :-----: | :--------------: | :-------------: | :-----------: | | 增删改 Adminnistrator | N | N | N | Y | | 增删改 Committee Member | N | N | N | Y | | 增删改 Authority Issuer | N | N | Y(可多签) | Y | | 发行授权 CPT | N | Y | Y | Y |
我们通过对 AuthorityIssuer.sol
合约模块的升级,来实现多签的功能。
- 限量发行方向
在当前的流程中,我们会通过合约定义 CPT(Claim Protocol Type,凭证的声明类型),然后根据自定义的 CPT 模板发布 Credential(可验证的数字凭证)。
Crendential 和 ERC721 有类似之处,因此我们可以对发行 Credential 的流程进行升级,并加入新的合约,使其支持某一类型的 CPT 「限量发行」。例如某合格证书只发行一千个。
3. WeIdentity 合约结构与升级部分示意图
4. 权限控制(多签)的简介、接口描述与使用示范
AuthorityIssuerController
合约主要功能是对于 AuthorityIsser 角色的增加、删除、修改与查询,本次升级在增加中加入多签功能。
4.1 合约接口描述
-
addAuthorityIssuer 功能 :新增 AuthorityIssuer
类型:原函数修改
参数:
| 变量名 | 类型 | 含义 | | :-----------: | :---------: | :-----------------------: | | addr | Address | 新增authorityIssuer的地址 | | attribBytes32 | bytes32[16] | 名字 | | attribInt | int[16] | 创建日期 | | accValue | bytes | 值(预留,目前无用) |
返回值: 无
-
signTransaction 功能 :实现多签功能
类型:新增函数
参数:
| 变量名 | 类型 | 含义 | | :-----------: | :--: | :-------------------: | | transactionId | uint | 需要进行多签的交易 id |
返回值:无
-
getTxIDNeedMultiSigNum 功能 :查询某交易还需要的签名数
类型:新增函数
参数:
| 变量名 | 类型 | 含义 | | :-----------: | :--: | :--------------: | | transactionId | uint | 需要查询的交易id |
返回值:
| 变量名 | 类型 | 含义 | | :-----------------: | :--: | :------------------------: | | TxIDNeedMultiSigNum | uint | 查询的交易还需要的多签数量 |
-
getPendingTransactions 功能 :获取当前所有需要被多签的交易
类型:新增函数
参数:无
返回值:
| 变量名 | 类型 | 含义 | | :-----------------: | :----: | :----------------------: | | PendingTransactions | uint[] | 当前所有需要被多签的交易 |
-
setTxIdMultiSig 功能 :设置某交易的多签数量
类型:新增函数
说明:因为该函数决定了新增 Authority Issuer 所需要的 Committee Member 数量,因此调用该函数需要 Administrator 权限【[见2](# 2 WeIdentity 升级点) 】。
参数:
| 变量名 | 类型 | 含义 | | :-----------: | :--: | :--------------: | | transactionId | uint | 需要设置的交易id | | minNumber | uint | 要求的多签数量 |
返回值:无
4.2 合约使用示范
- 使用账户1部署合约
- 部署成功
- 测试新增 authorityIssuer 函数
其中,address 是新增为 authorityIssuer 的账户地址,attribBytes32 是名字,attribInt 是创建的日期.
- 填写参数,进行测试
transact后,该交易会被放入等待交易队列中,结果返回的交易序号为3。
- 测试查询等待队列函数
由于上述交易逻辑上会被保存进等待队列,因此这里我们去查看一下等待队列中是否真正被放入了该交易:
查询结果与逻辑无误。
- 设置多签要求
在多签之前,我们需要先为该等待交易设置多签数量,若不设置,则无法进行多签,这里我们为上述等待交易设置多签限制为2。
- 测试多签函数
设置完成后,我们使用当前账户(具备权限)对上述交易序号为3的交易进行多签:
结果返回签名成功,我们再切换其他具有权限的账户进行签名,这里是否具有权限是通过这段代码进行判断。
if(!roleController.checkPermission(tx.origin,roleController.MODIFY_AUTHORITY_ISSUER())) { return; }
使用第二个有权限的账户签名成功,由于已满足多签要求,因此新增成功:
5. 限量 CPT 的简介、接口描述与使用示范
1) CredentialController
为全新合约,主要功能为:
- 声明某 Id 的 Cpt 的 Credential 的发行数量,并存储。
- 发行 Credential 时生成需要的 ID 号与随机数,并存储。
- 提供如下查询:
- 通过 CPT Id 查询某 CPT 类型的总数及已发行数量。
- 通过 Credential Id 查询某 Credential 的相应随机数。
2) EvidenceContract
为旧合约的升级,主要功能是凭证上链,目前对 createEvidence 函数进行增强,加入 creid 与 randNum 两个参数,以实现链上验证的目的。
流程从链下发行 Credential,然后再通过 evidence 进行链上存证,转变为更复杂的**「链上限量声明 → 带验证的发行 → Credential 的合法性与限量 CPT 的总量 / 已发行量可链上查询」**逻辑,以实现某一类型的 CPT 限量发行。
具体步骤描述如下:
-
部署包含 CredentialController合约的WeIdentity 升级合约。
-
发行CPT(凭证模板)。
-
通过CredentialController 合约为 CPT 设置限额。
CPT 限量数额默认为零,也就是说如果 CPT 遵循限量发行流程(自然也可以选择传统流程),该 CPT 无法发行Credential,必须在设置后,方可发行。
-
查看某 CPT 限额。
-
发行基于CPT凭证模板的 Credential 凭证。
5.1. CredentialControlle r合约接收到 cpt_id ,查看该cpt是否超出限量。
5.2. 如果超出限量,则返回失败。
5.3. 如果没有超出限量,则通过CredentialController,credential_num(凭证计数器)+1,生成、存储并返会,credential_id与一个随机识别码rand_str,如299(第299个凭证)与b24136ac-58cd-48be-8822-c532d46297e5。
5.4. 链下基于credential_id,rand_str与其它数据payload,共同组装未签名credential_unsigned。
5.5. 调用evidence合约进行链上存证。
5.6.查看 credential_unsigned的credential_id与随机识别码rand_str是否与5.3中存储的数据匹配。
5.7. 不匹配则发行失败。
5.8. 凭证发行方对credential_unsigned进行签名,生成credential,授予接收对象,一张限量Credential发行完毕。
5.1 合约接口描述
-
generateIdAndRandNum 功能 :生成 credentialID 号与随机数
类型:新增函数
参数:
| 变量名 | 类型 | 含义 | | :----: | :--: | :-----------------: | | cptid | uint | 要使用的 cpt 的编号 |
返回值:
| 变量名 | 类型 | 含义 | | :-----: | :--: | :--------------------: | | creid | uint | 生成的 credential 编号 | | randNum | uint | 生成的随机数 |
-
setLimit 功能 :设置某类型cpt的可发行的限量数额
类型:新增函数
参数:
| 变量名 | 类型 | 含义 | | :------: | :--: | :---------------------: | | cptid | uint | 要使用的 cpt 的编号 | | limitNum | uint | 该类型cpt限量发行的额数 |
返回值:无
-
getCptLimitAndIssuedNum 功能 :获取某类型 cpt 的可发行的限量数额与已发行 credential 的数量
类型:新增函数
参数:
| 变量名 | 类型 | 含义 | | :----: | :--: | :-----------------: | | cptid | uint | 要查询的 cpt 的编号 |
返回值:
| 变量名 | 类型 | 含义 | | :----------: | :--: | :---------------------------------------: | | limitNumber | uint | 查询的 cpt 类型的可发行限量数额 | | issuedNumber | uint | 查询的 cpt 类型的已发行 credential 的数量 |
-
getRandNumOfCreid 功能 :获得某 credential 中的的随机数
类型:新增函数
参数:
| 变量名 | 类型 | 含义 | | :----: | :--: | :----------------------: | | creid | uint | 要查询的 credential 编号 |
返回值:
| 变量名 | 类型 | 含义 | | :-----: | :--: | :----------------------: | | randNum | uint | 查询的credential的随机数 |
-
createEvidence 功能 :存证上链
类型:原函数修改
参数:
| 变量名 | 类型 | 含义 | | :-----: | :-----: | :-------------------------: | | hash | string | 查询存证的key | | sig | string | 发布存证的人的签名 | | extra | string | 任意额外数据 | | updated | uint256 | 当前event的更新时间 | | creid | uint | 某类型的cpt编号(新增变量) | | randNum | uint | 随机数(新增变量) |
返回值:
| 变量名 | 类型 | 含义 | | :----: | :--: | :------------------: | | result | uint | 上链成功与否的反馈值 |
5.2 合约使用示范
- 部署CredentialController合约
- 为某类型cpt设置限量数额
CPT 限量数额默认为零,也就是说如果 CPT 遵循限量发行流程(自然也可以选择传统流程),该 CPT 无法「发行」Credential,必须在设置后,方可发行。
设置成功
- 查看某类型cpt限额
这里我们查询刚刚设置的cptid为1的类型的限额
结果为我们刚刚设置的限额1,以及当前已发行的credential数量为0
- 生成 Credential Id与随机数
填写cptid,基于该类型生成一对 credential Id 与随机数
生成成功,得到 credential Id 与随机数,该id与随机数一一匹配,用于后续 Evidence 上链时的合法检验。
- 部署 EvidenceContract 合约
将此前部署的CredentialController合约地址填入,进行部署
- 存证上链
其中creid为要上链的credential的id号,randNum 为此前发行 credential 时得到的与id号一一配对的随机数。
填写参数,randNum处先随意填一个randNum,由于不配对,因此结果返回为0,上链失败。
再填写配对的随机数,进行测试,结果返回为1,上链成功。
6. 总结与未来计划
-
对 Credential 限量功能进行进一步的完善
目前限量 Credential 的逻辑是 AuthorityIssuer 在发行 CPT 时进行限量声明。如果进一步,我们可以做到多个 Issuer 协商 Credential 总量,之后每个特定的 Issuer 有特定的份额。
-
对 Credential 功能进行进一步的增强
例如 Credential 间的联动。
-
更全面更细化的权限控制
- 可以在更多方面引入多签。
- 引入更细化的权限控制,以应对实际生产环境中的复杂场景。
注:本文为「上海对外经贸大大学区块链技术与应用研究中心」获「BSN 第二次开发者大赛一等奖」的作品的详述
Github 地址:
https://github.com/SUIBE-Blockchain/WeIdentity-Smart-Contract2.0
本文档描述的合约均适用于:
FISCO BCOS / CITA。
0. 项目特性
-
智能合约创意新颖、设计巧妙和通用性强
WeIdentity 方案基于 Solidity 编写,适用于许多需要数字身份的场景,如教育、金融等。
本项目写的多签方案与 CredentialController 同理。
其中,CredentialController 为独立模块,因此不仅适用于 WeIdentity 方案,也适用于其它基于 Solidity 的 DID 方案。
-
智能合约函数、事件、结构等设计规范性、合理性、执行效率与安全性
本项目遵循 Solidity 开发规范,且每一个新增函数均包含测试,符合 TDD 原则。
-
代码编写简洁规范、可读性强,注释清晰准确
保证每一个函数均有标准注释,且变量命名清晰规范,具有高可读性。
-
设计说明文档规范、结构完整、内容详细准确
设计文档完整,包括其实现功能、结构设计、流程设计、使用演示与未来规划。
-
多底层框架版本
不仅适用于 FISCO BCOS,还适用于 CITA 等使用 EVM 的联盟链。
1. WeIdentity 介绍
WeIdentity是一套分布式多中心的技术解决方案,可承载实体对象(人或者物)的现实身份与链上身份的可信映射、以及实现实体对象之间安全的访问授权与数据交换。WeIdentity由微众银行自主研发并完全开源,秉承公众联盟链整合资源、交换价值、服务公众的理念,致力于成为链接多个垂直行业领域的分布式商业基础设施,促进泛行业、跨机构、跨地域间的身份认证和数据合作。
目前主要包括两大模块: WeIdentity DID 以及 WeIdentity Credential, 一个是去中心化身份,另一个是链上凭证。
WeIdentity 使用 Solidity 进行合约开发,主要包括以下两个部分:
- WeIdentity DID智能合约 ,负责链上 ID 体系建立,具体包括生成 DID(Distributed IDentity)、生成 DID Document、DID 在链上的读取与更新。
- WeIdentity Authority智能合约 ,负责进行联盟链权限管理,具体包括链上 DID 角色的定义、操作与权限的定义与控制。
2. WeIdentity 升级点
要讲 WeIdentity 合约使用于正式生产环境,还有一些地方需要升级。
- 权限控制方向
目前 WeIdentity 合约的权限控制方案:
在实际生产环境中, 我们需要包括多签功能的更精准的权限控制。
在进行修改后,权限控制方案如下:
操作 | 一般DID | Authority Issuer | Commitee Member | Administrator |
---|---|---|---|---|
增删改 Adminnistrator | N | N | N | Y |
增删改 Committee Member | N | N | N | Y |
增删改 Authority Issuer | N | N | Y(可多签) | Y |
发行授权 CPT | N | Y | Y | Y |
我们通过对 AuthorityIssuer.sol
合约模块的升级,来实现多签的功能。
- 限量发行方向
在当前的流程中,我们会通过合约定义 CPT(Claim Protocol Type,凭证的声明类型),然后根据自定义的 CPT 模板发布 Credential(可验证的数字凭证)。
Crendential 和 ERC721 有类似之处,因此我们可以对发行 Credential 的流程进行升级,并加入新的合约,使其支持某一类型的 CPT 「限量发行」。例如某合格证书只发行一千个。
3. WeIdentity 合约结构与升级部分示意图
4. 权限控制(多签)的简介、接口描述与使用示范
AuthorityIssuerController
合约主要功能是对于 AuthorityIsser 角色的增加、删除、修改与查询,本次升级在增加中加入多签功能。
4.1 合约接口描述
-
addAuthorityIssuer 功能 :新增 AuthorityIssuer
类型:原函数修改
参数:
变量名 类型 含义 addr Address 新增authorityIssuer的地址 attribBytes32 bytes32[16] 名字 attribInt int[16] 创建日期 accValue bytes 值(预留,目前无用) 返回值: 无
-
signTransaction 功能 :实现多签功能
类型:新增函数
参数:
变量名 类型 含义 transactionId uint 需要进行多签的交易 id 返回值:无
-
getTxIDNeedMultiSigNum 功能 :查询某交易还需要的签名数
类型:新增函数
参数:
变量名 类型 含义 transactionId uint 需要查询的交易id 返回值:
变量名 类型 含义 TxIDNeedMultiSigNum uint 查询的交易还需要的多签数量 -
getPendingTransactions 功能 :获取当前所有需要被多签的交易
类型:新增函数
参数:无
返回值:
变量名 类型 含义 PendingTransactions uint[] 当前所有需要被多签的交易 -
setTxIdMultiSig 功能 :设置某交易的多签数量
类型:新增函数
说明:因为该函数决定了新增 Authority Issuer 所需要的 Committee Member 数量,因此调用该函数需要 Administrator 权限【[见2](# 2 WeIdentity 升级点) 】。
参数:
变量名 类型 含义 transactionId uint 需要设置的交易id minNumber uint 要求的多签数量 返回值:无
4.2 合约使用示范
- 使用账户1部署合约
- 部署成功
- 测试新增 authorityIssuer 函数
其中,address 是新增为 authorityIssuer 的账户地址,attribBytes32 是名字,attribInt 是创建的日期.
- 填写参数,进行测试
transact后,该交易会被放入等待交易队列中,结果返回的交易序号为3。
- 测试查询等待队列函数
由于上述交易逻辑上会被保存进等待队列,因此这里我们去查看一下等待队列中是否真正被放入了该交易:
查询结果与逻辑无误。
- 设置多签要求
在多签之前,我们需要先为该等待交易设置多签数量,若不设置,则无法进行多签,这里我们为上述等待交易设置多签限制为2。
- 测试多签函数
设置完成后,我们使用当前账户(具备权限)对上述交易序号为3的交易进行多签:
结果返回签名成功,我们再切换其他具有权限的账户进行签名,这里是否具有权限是通过这段代码进行判断。
if(!roleController.checkPermission(tx.origin,roleController.MODIFY_AUTHORITY_ISSUER())) { return; }
使用第二个有权限的账户签名成功,由于已满足多签要求,因此新增成功:
5. 限量 CPT 的简介、接口描述与使用示范
1) CredentialController
为全新合约,主要功能为:
- 声明某 Id 的 Cpt 的 Credential 的发行数量,并存储。
- 发行 Credential 时生成需要的 ID 号与随机数,并存储。
- 提供如下查询:
- 通过 CPT Id 查询某 CPT 类型的总数及已发行数量。
- 通过 Credential Id 查询某 Credential 的相应随机数。
2) EvidenceContract
为旧合约的升级,主要功能是凭证上链,目前对 createEvidence 函数进行增强,加入 creid 与 randNum 两个参数,以实现链上验证的目的。
流程从链下发行 Credential,然后再通过 evidence 进行链上存证,转变为更复杂的 「链上限量声明 → 带验证的发行 → Credential 的合法性与限量 CPT 的总量 / 已发行量可链上查询」 逻辑,以实现某一类型的 CPT 限量发行。
具体步骤描述如下:
-
部署包含 CredentialController合约的WeIdentity 升级合约。
-
发行CPT(凭证模板)。
-
通过CredentialController 合约为 CPT 设置限额。
CPT 限量数额默认为零,也就是说如果 CPT 遵循限量发行流程(自然也可以选择传统流程),该 CPT 无法发行Credential,必须在设置后,方可发行。
-
查看某 CPT 限额。
-
发行基于CPT凭证模板的 Credential 凭证。
5.1. CredentialControlle r合约接收到 cpt_id ,查看该cpt是否超出限量。
5.2. 如果超出限量,则返回失败。
5.3. 如果没有超出限量,则通过CredentialController,credential_num(凭证计数器)+1,生成、存储并返会,credential_id与一个随机识别码rand_str,如299(第299个凭证)与b24136ac-58cd-48be-8822-c532d46297e5。
5.4. 链下基于credential_id,rand_str与其它数据payload,共同组装未签名credential_unsigned。
5.5. 调用evidence合约进行链上存证。
5.6.查看 credential_unsigned的credential_id与随机识别码rand_str是否与5.3中存储的数据匹配。
5.7. 不匹配则发行失败。
5.8. 凭证发行方对credential_unsigned进行签名,生成credential,授予接收对象,一张限量Credential发行完毕。
5.1 合约接口描述
-
generateIdAndRandNum 功能 :生成 credentialID 号与随机数
类型:新增函数
参数:
变量名 类型 含义 cptid uint 要使用的 cpt 的编号 返回值:
变量名 类型 含义 creid uint 生成的 credential 编号 randNum uint 生成的随机数 -
setLimit 功能 :设置某类型cpt的可发行的限量数额
类型:新增函数
参数:
变量名 类型 含义 cptid uint 要使用的 cpt 的编号 limitNum uint 该类型cpt限量发行的额数 返回值:无
-
getCptLimitAndIssuedNum 功能 :获取某类型 cpt 的可发行的限量数额与已发行 credential 的数量
类型:新增函数
参数:
变量名 类型 含义 cptid uint 要查询的 cpt 的编号 返回值:
变量名 类型 含义 limitNumber uint 查询的 cpt 类型的可发行限量数额 issuedNumber uint 查询的 cpt 类型的已发行 credential 的数量 -
getRandNumOfCreid 功能 :获得某 credential 中的的随机数
类型:新增函数
参数:
变量名 类型 含义 creid uint 要查询的 credential 编号 返回值:
变量名 类型 含义 randNum uint 查询的credential的随机数 -
createEvidence 功能 :存证上链
类型:原函数修改
参数:
变量名 类型 含义 hash string 查询存证的key sig string 发布存证的人的签名 extra string 任意额外数据 updated uint256 当前event的更新时间 creid uint 某类型的cpt编号(新增变量) randNum uint 随机数(新增变量) 返回值:
变量名 类型 含义 result uint 上链成功与否的反馈值
5.2 合约使用示范
- 部署CredentialController合约
- 为某类型cpt设置限量数额
CPT 限量数额默认为零,也就是说如果 CPT 遵循限量发行流程(自然也可以选择传统流程),该 CPT 无法「发行」Credential,必须在设置后,方可发行。
设置成功
- 查看某类型cpt限额
这里我们查询刚刚设置的cptid为1的类型的限额
结果为我们刚刚设置的限额1,以及当前已发行的credential数量为0
- 生成 Credential Id与随机数
填写cptid,基于该类型生成一对 credential Id 与随机数
生成成功,得到 credential Id 与随机数,该id与随机数一一匹配,用于后续 Evidence 上链时的合法检验。
- 部署 EvidenceContract 合约
将此前部署的CredentialController合约地址填入,进行部署
- 存证上链
其中creid为要上链的credential的id号,randNum 为此前发行 credential 时得到的与id号一一配对的随机数。
填写参数,randNum处先随意填一个randNum,由于不配对,因此结果返回为0,上链失败。
再填写配对的随机数,进行测试,结果返回为1,上链成功。
6. 总结与未来计划
-
对 Credential 限量功能进行进一步的完善
目前限量 Credential 的逻辑是 AuthorityIssuer 在发行 CPT 时进行限量声明。如果进一步,我们可以做到多个 Issuer 协商 Credential 总量,之后每个特定的 Issuer 有特定的份额。
-
对 Credential 功能进行进一步的增强
例如 Credential 间的联动。
-
更全面更细化的权限控制
- 可以在更多方面引入多签。
- 引入更细化的权限控制,以应对实际生产环境中的复杂场景。
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
- 发表于 21分钟前
- 阅读 ( 6 )
- 学分 ( 0 )
- 分类:FISCO BCOS
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 拿起Mac来渗透:恢复凭证
- Mimikatz提取Windows用户凭证分析
- 避免凭证转储攻击的5个技巧
- Windows凭证的伪造和窃取技术总结
- Kutaki恶意软件绕过网关窃取用户凭证
- [WCF安全系列]认证与凭证:X.509证书
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
做自己:鬼脚七自媒体第一季
鬼脚七 / 电子工业出版社 / 2013-7 / 77.00元
当我们习惯了在社会上带着面具的时候,真实成为了一件奢侈的事情。 做到足够真实,让自己的本性表达出来,这需要勇敢。本书是鬼脚七自媒体的原创文集,主题就是做自己。本书有关于生活、互联网、自媒体的睿智分享,也有关于淘宝、搜索的独到见解,是一本接地气,文艺范,并充满正能量的电商生活书。 本书最适合淘宝卖家、电子商务人群、希望了解电商和互联网的人群阅读,也推荐热爱生活的70、80、90后阅读。一起来看看 《做自己:鬼脚七自媒体第一季》 这本书的介绍吧!