账号被盗后恢复的办法和原理(附源代码)

in hive-180932 •  5 years ago  (edited)

在steem上玩耍,如果不小心丢了密码怎么办?密码被黑客修改了怎么办?

别惊慌,还是能找回的。办法就是寻找账户创建人恢复账号。

需要的东西有两个
1.30天内用过的账户密码(要有owner权限)
2.一个可靠的账户创建人

原理是如何的呢?我简单用大白话解释一下。

假设这里被盗的账号是@fishaa,而账户创建者就是@maiyude

1.首先@fishaa重设了一个密码,把账户的公钥发给了@maiyude,假设这个公钥就是“STEMXXXNEW"

2.@maiyude通过各种途径,确定了寻求帮助的@fishaa是被盗者本人。(确定这点很重要,因为黑客也可以发出请求协助的要求,不确定的话改来改去个没完。)

3.@maiyude在区块链上发布了一个广播,内容如下
@fishaa被盗号啦,我是他的恢复人@maiyude,我要帮助他重设新密码为“STEMXXXNEW"。”

4.当上述广播被区块确认后,@fishaa本人就可以去发一个广播,把密码修改回来了。广播内容如下:
“我@fishaa,账号被盗了,我要重设一个新密码。我的新密码是““STEMXXXNEW"”,老密码是“STEMMxxxOLD”。”

5.账号密码成功重设。

这里面账户创建人@maiyude全过程只接触了账号的公钥,不知道私钥,所以非常安全。
@fishaa拥有账户创建人@maiyude为他做证明,同时还使用了老密码和新密码签名广播,所以也验证了他是曾经拥有账户的本人,也验证了账户恢复人@maiyude发广播中的公钥是他的,所以不会出现误领的现象。

重点

重设密码有两个重点:

  • 1 .需要知道30天内用过的密码,这用于验证账号是不是你的。
  • 2.一个可靠的账户创建人很重要!!!如果你的账号创建人是不可靠的,你很可能无法重设密码。并且如果他在创建账号的时候记录了你的密码。那么,在30天内,你的账号很可能被随时随意的修改密码。因为他同时满足了修改密码的两点。

这是非常危险的,如果你的账号使用了不可靠的第三方服务创建,请马上修改账户创建人。



下面上实操代码

第一步,我们让@fishaa重设一个密码:

假设密码为“P579KW3z524GvZupBKeFTK8M1LyRP2uEcwms3X8WfUYXVmhxVqG”,这密码是自己随便打的,你也可以设置为“123456”啥的。

我们可以通过以下代码计算出账户的公私钥:

from beemgraphenebase.account import PasswordKey

player="fishaa"
password="P579KW3z524GvZupBKeFTK8M1LyRP2uEcwms3X8WfUYXVmhxVqG"#新密码

#从新密码生成KEY
owner_key = PasswordKey(player, password, role="owner")
posting_key = PasswordKey(player, password, role="posting")
active_key = PasswordKey(player, password, role="active")
memo_key = PasswordKey(player, password, role="memo")

#新密码_私钥
owner_key_private=owner_key.get_private()
posting_key_private = posting_key.get_private()
active_key_private = active_key.get_private()
memo_key_private = memo_key.get_private()
print("新密码私钥")
print("主密码:",password)
print("owner_key:",owner_key_private)
print("posting_key:",posting_key_private)
print("active_key:",active_key_private)
print("memo_key:",memo_key_private)

print("------------------------------")
print("新密码公钥")
owner_key_get_public=owner_key.get_public()
posting_key_get_public = posting_key.get_public()
active_key_get_public = active_key.get_public()
memo_key_get_public = memo_key.get_public()
print("owner_key:",owner_key_get_public)
print("posting_key:",posting_key_get_public)
print("active_key:",active_key_get_public)
print("memo_key:",memo_key_get_public)

通过运行上面的代码,我们可以记录下所有的公私钥。
然后我们把owner key的公钥发给账户创建人@maiyude
这把公钥是:STM7MzCwhcxjjXZj9w8ZnV3HkqKw7cGCvUcQUS1RfHB48XQtCx2BM(owner_key)

通过各种途径联系账户创建人@maiyude,请求协助。


第二步,账户创建人@maiyude发布一个@fishaa被盗号,需要重设密码的广播,代码如下:

from beem.steem import Steem
from beembase import operations
from beem.transactionbuilder import TransactionBuilder


nodes="https://cn.steems.top"#节点

player="maiyude"#账户恢复人
key="5JxxxxxxxxxxxxxxxxxxxxxxxxxxxZwj"#恢复人的active key

toplayer="fishaa"#被恢复者

owner_key="STM7MzCwhcxjjXZj9w8ZnV3HkqKw7cGCvUcQUS1RfHB48XQtCx2BM"#@fishaa的新公钥

s = Steem(keys=[key],nodes=nodes)


who_owner = {'weight_threshold': 1, 'account_auths': [], 'key_auths': [[str(owner_key), 1]]}

op = operations.Request_account_recovery(
    **{
        "recovery_account": player,
        "account_to_recover": toplayer,
        "new_owner_authority": who_owner
    })

tx = TransactionBuilder(steem_instance=s)

tx.appendOps(op)
# 把签名添加并签名
tx.appendSigner(player, "active")

tx.sign()


# 广播
tx.broadcast()

image.png

成功广播,内含新密码的公钥。


第三步,被盗者@fishaa发布广播,重设密码

需要旧密码和新密码同时签名

代码如下:

from beem.steem import Steem
from beembase import operations
from beem.transactionbuilder import TransactionBuilder
from beemgraphenebase.account import PasswordKey

nodes="https://cn.steems.top"#节点

toplayer="fishaa"#被盗者
password="P579KW3z524GvZupBKeFTK8M1LyRP2uEcwms3X8WfUYXVmhxVqG"#新密码
old_password="P5uPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxgH"#30天内老密码




#从新密码获取账户owner公私钥
owner_key = PasswordKey(toplayer, password, role="owner")
owner_key_private=owner_key.get_private_key()
owner_key_public=owner_key.get_public()



#从旧密码获取账户owner公私钥
old_key = PasswordKey(toplayer, old_password, role="owner")# owner key
old_key_private=old_key.get_private_key()
old_key_public=old_key.get_public_key()


#写入广播信息
who_owner_new = {'weight_threshold': 1, 'account_auths': [], 'key_auths': [[str(owner_key_public), 1]]}
who_owner_old = {'weight_threshold': 1, 'account_auths': [], 'key_auths': [[str(old_key_public), 1]]}

op = operations.Recover_account(
    **{
        "account_to_recover": toplayer,
        "new_owner_authority": who_owner_new,
        "recent_owner_authority": who_owner_old,
        "extensions": []
    })

s = Steem(nodes=nodes)
tx = TransactionBuilder(steem_instance=s)

tx.appendOps(op)

# 把签名添加并签名
tx.appendWif(str(owner_key_private))#新密码签名
tx.appendWif(str(old_key_private))#老密码签名
tx.sign()


# 广播
tx.broadcast()
print("完成")

image.png

成功重设,可以看到,账户的新公钥已经生效了。
下面的signatures有两行,分别是旧密码和新密码的签名生成的。

到此结束

再次提醒,一个靠谱的账户恢复人很重要!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  
  ·  5 years ago 

鱼哥好犀利😄
拍拍拍
!shop

支持你的贴子(by MARLIANS)

  ·  5 years ago 

你好鸭,maiyude!
@hertz300赠送1枚SHOP币给你!

目前你总共有: 2枚SHOP币

查看或者交易 SHOP币 请到 steem-engine.com.

无聊吗?跟我猜拳吧! **石头,剪刀,布~**
  ·  5 years ago 

剪刀

  ·  5 years ago 


You lose! 你输了!不给我点赞,你就再吃我一拳~

  ·  5 years ago 

石头

  ·  5 years ago 


It’s a tie! 平局!再来!下回我再出拳头!

  ·  5 years ago 

石头

  ·  5 years ago 


You win!!!! 你赢了! 给你1枚SHOP币!

支持原创

  ·  5 years ago 

不错的介绍
很详细