使用bitshares账户密码以及python-bitshares直接获取私钥以及公钥

in #bitshares6 years ago

在昨天的帖子中,我介绍了如何导出导入私钥等操作:

然而,作为一个程序猿,总觉得登陆来登陆去,点啊点啊的太麻烦,那么有没有方便快捷的方法获取私钥呢?前一阶段在学习python-bitshares,好吧,我承认我挖的坑还没有填完,以后慢慢填吧,让我先来尝试一下能否用账户密码以及python-bitshares直接获得私钥。


(图源 :pixabay)

使用PasswordKey类获取私钥

经过一番学习,发现python-bitshares中有个PasswordKey

用这个类,可以获取账户密码的对应私钥,简单的示例代码如下:

from bitsharesbase.account import PasswordKey

account = "test2018"
passwd = "P5JiDXtCaDdCTgCrkXAG2fEzVUjrBxSJbx9MsXXXXXX"
role = "active"

pwkey = PasswordKey(account, passwd, role=role)
private_key = pwkey.get_private()

print("Account:", account)
print("Passwd:",  passwd)
print("PrivateKey:",  private_key)

运行结果如下:

我们成功的获取了这个账户对应的Active Private Key.

为了校验一下我们获取的私钥是否正确,我登陆网页钱包查看了一下私钥:

对比上述私钥,可知我们获得的结果是正确的。

如何获得公钥

我们已经可以使用PasswordKey类获取私钥,但是为了校验我们获得的私钥是否正确,还特意登陆了网页钱包查看了一下私钥。这岂不是多此一举!既然还需要登陆网页钱包,那么直接获得私钥就好了,何必还用程序生成。

那么有啥办法来查看我们生成的私钥是否是账户对应的私钥呢?
很简单,对比一下公钥就可以了。

为了对比公钥,我们需要获得账户的公钥,以及用程序生成公钥。

账户的公钥可以通过区块链浏览器查看

以上为我这个账户的公钥,我们暂且以Active KEY为例。

将上述代码的下半部分更新成如下内容:

pwkey = PasswordKey(account, passwd, role=role)
private_key = pwkey.get_private()
public_key = pwkey.get_public()

print("Account:", account)
print("Passwd:",  passwd)
print("PrivateKey:",  private_key)
print("PublicKey:",  public_key)

结果,这是什么鬼?

貌似公钥的值是正确的,但是前缀是GPH而不是BTS

看了一下代码,原来PasswordKey的get_private()和get_public()都是调用了父类石墨烯库中的PasswordKey中的方法。而在父类中,默认的前缀是GPH而不是BTS

要解决这个问题,一种方式是修改python-bitshares以及python-graphenelib库中对应的函数,这个比较麻烦。

所以我采用了另外一种方法:
即由Private Key 从新生成公钥
public_key = PrivateKey(str(private_key)).pubkey
因为我们调用的是python-bitshares中的PrivateKey类,所以默认的前缀为BTS,无需我们在参数中设置


前缀完全正常,和区块链浏览器中对比完全一致。

完整的示例代码

from bitsharesbase.account import PasswordKey
from bitsharesbase.account import PrivateKey

account = "test2018"
passwd = "P5JiDXtCaDdCTgCrkXAG2fEzVUjrBxSJbx9MsXXXXXX"
role = "active"

pwkey = PasswordKey(account, passwd, role=role)
private_key = pwkey.get_private()
#public_key = pwkey.get_public()
public_key = PrivateKey(str(private_key)).pubkey

print("Account:", account)
print("Passwd:",  passwd)
print("PrivateKey:",  private_key)
print("PublicKey:",  public_key)

以上为完整的示例代码,仅供参考。

结论


(图源 :pixabay)

使用账户密码以及python-bitshares中的PasswordKey类,可以轻易获取对应账户的私钥,无需登陆网页钱包等繁琐的步骤。

可以使用生成的私钥使用PrivateKey类来生成公钥与区块链浏览器上显示的公钥信息对比验证是否正确。

以上代码仅供参考。

Sort:  

i guess i need to learn chinese / Japanese hehe

钦佩程序员的严谨和细致。

Thanks @oflyhigh for updates and informations about security of passwords.

I am still kind of lazy, using cmd ...haha

Great post there! Our eyes is like our passward, its the window through which we see the world. We should endeavour to protect it always. I follow and upvote you.

Can you make it English version post.