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

in STEEM CN/中文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有两行,分别是旧密码和新密码的签名生成的。

到此结束

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

Sort:  

鱼哥好犀利😄
拍拍拍
!shop

支持你的贴子(by MARLIANS)

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

目前你总共有: 2枚SHOP币

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

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

剪刀


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

石头


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

石头


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

不错的介绍
很详细