首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Dapps中建立安全机制?

如何在Dapps中建立安全机制?
EN

Ethereum用户
提问于 2019-10-24 06:44:16
回答 1查看 155关注 0票数 0

我在建一家贷款公司。该功能不容易构建,但相对简单。但是,我的问题是,是否有人对如何构建用户登录和安全性有任何建议?这些合同是以可靠的方式编写的,我使用的是Web3JS的HTML前端。

我真的很感激你能给我的任何建议。

谢谢

EN

回答 1

Ethereum用户

发布于 2019-10-24 08:50:00

有人对如何构建用户登录和安全性有任何建议吗?

对于新来者来说,一个艰难的转变是用户根本不注册,至少他们不应该注册。

您可以做的最安全的事情是依赖msg.sender来验证使用私钥签名的用户。您可以酌情收集和记录有关用户的属性,但是要理解,每个交互的用户都是在没有我们任何帮助的情况下进行身份验证的。

客户端的密钥管理,控制这些密钥的委员会和quorum的形成都是外部问题,甚至可能由其他合同处理。一般来说,在智能合同设计中,这些创新都是零关注的。

可以使用像Eth这样的JavaScript库生成地址和密钥对,客户端(您应该希望了解用户的签名密钥)。它甚至有可能减轻用户支付煤气费的负担(另一种支付方案确实出现在合同中)。

TL;DR;

每个人都已经注册了。

有些用户可能拥有白名单中描述的成员资格或特权,但没有人需要注册。

服务器

如果您正在使用服务器和块链构建DApp,那么逻辑拓扑通常是三角形的--服务器、块链/契约和用户。在这种情况下,从合同的角度来看,服务器也是一个“客户端”,它也用自己的密钥签名。服务器侦听未通过服务器而提交的事务用户的区块链。它可以使用钱包地址作为唯一的标识符,并且可以通过让用户签署一条非链式消息并免费发送,从而最终确认web用户控制了某个地址。用户体验可以相当好,而不损害用户的键。

希望能帮上忙。

更新

听菲利普的评论。一些实现的提示。

这些流程与您可能预期的略有不同。它不像用户=>服务器=>数据库,用户通过服务器存储。用户说:

  • 用户=> =>合同

  • 用户=>浏览器=>服务器

此外,服务器还说:

  • 服务器=> =>合同

用户、服务器和契约是三角形的三个点,有时每个点都与另外两个“对话”。

该合同将具有基于msg.sender的访问控制,该访问控制始终是经过身份验证的事务签名者。它会用它来整理许可。

服务器将使用相同的密钥,即他们的地址来标识用户。用户将签署一条消息(JavaScript),服务器将验证签名(JavaScript),以证明该消息由某个地址签名。通过让用户浏览器检查用户帐户const accounts = await web3.eth.getAccounts();,您可以在一个简化的近似情况下构建这个框架。让用户选择他们的一个帐户(这是一个数组)并将其作为表单数据传递。服务器可以信任客户端没有说谎,并继续进行。它不安全。稍后,您可以通过让用户签名一条服务器将验证的消息来加强它。

你必须决定角色。让我们说,将有specialUsers,superUsers和其他人。一般的非特权用户池不需要任何特殊的注意,但是您可以自由地记录关于它们的属性,在契约中(昂贵的)或在服务器上。使用他们的地址作为Uid。

将部署合同的人设置为superUser。让我们进一步决定服务器将是superUser,因此在部署仪式上,服务器将处理它。

代码语言:javascript
复制
contract Groups  {

  address public superUser;

  constructor() public {
    superUser = msg.sender;
  }
}

我们将保卫某些职能。在构造函数前面插入:

代码语言:javascript
复制
modifier onlySuperUser {
  require(msg.sender == userUser, "403 - not allowed.");
  _;
}

SpecialUsers将是一个白名单,只有SuperUser才能维护它:

代码语言:javascript
复制
mapping(address => bool) public specialUsers;

创造一个守卫:

代码语言:javascript
复制
modifier onlySpecialUser {
  require(specialUser[msg.sender[, "403 - not allowed.";
  _;
}

创建维护:

代码语言:javascript
复制
function setSpecialUser(address user, bool isAllowed) public onlySuperUser {
  specialUser[user] = isAllowed;
}

它显示了警卫的使用情况(修饰符onlySuperUser)。

有一个流行的模式,Ownable.sol (openzeppelin),每个人都应该从。您可以复制并调整它以创建多个角色。还有一种模式叫做RBAC -基于角色的访问控制.

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/76938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档