账号被盗后恢复的办法和原理(附源代码)
在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()
成功广播,内含新密码的公钥。
第三步,被盗者@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("完成")
成功重设,可以看到,账户的新公钥已经生效了。
下面的signatures有两行,分别是旧密码和新密码的签名生成的。
到此结束
鱼哥好犀利😄
拍拍拍
!shop
支持你的贴子(by MARLIANS)
你好鸭,maiyude!
@hertz300赠送1枚SHOP币给你!
目前你总共有: 2枚SHOP币
查看或者交易
无聊吗?跟我猜拳吧! **石头,剪刀,布~**SHOP币
请到 steem-engine.com.剪刀
You lose! 你输了!不给我点赞,你就再吃我一拳~
石头
It’s a tie! 平局!再来!下回我再出拳头!
石头
You win!!!! 你赢了! 给你1枚SHOP币!
支持原创
不错的介绍
很详细