おふとんの中から寝言をつぶやく

ビットコインなどの暗号(仮想)通貨関連の話題を中心に雑多に書きます。

仮想マシンで暗号化プログラムを動かす時にはまったことと解決方法

新タイプの蛇口を作っていてデータの暗号化をするときに、なかなかおわらないことがあり調べていったところ、仮想マシン上でエントロピー(質のいいランダムな値を作るために必要な値)がとても少ない状態であったことがわかりました。

環境:guest : ubuntu 18.04LTS

host: ubuntu 16.04.LTS

CPU: Ryzen 2700

 

bashコマンドライン

cat /proc/sys/kernel/random/entropy_avail

 

この結果が1000以下だと少ないようですが、使っていた仮想マシンエントロピーはなんと1桁でした。少なすぎる。

 

/dev/randomを使うときにエントロピーが少ないと、エントロピーがたまるまで動作が止まってしまいます。

 

それでは使いものにならないのでどうするか探していたところ、まずハードウェアをいじるなら、AMDRyzen PROを使えば、TPMというファームウェアに直結したランダムジェネレーターがある。ただしお金がかかる。お金を使わない方ではrng-toolsというソフトを使えばいいことがわかりました。

 

bash

apt install rng-tools

 これ、仮想マシンにもホストマシンにも入れましょう。

 

仮想マシンで実行してみたものの、このままでは使えませんでした。

 KVMコマンドを使って起動しているので、起動時のパラメータに、

-device virtio-rng-pci

を追加して、無事に使えるようになりました。

 

しかし、ホストOSでもエントロピーが1000以下になることがあったため、ホストにもrng-toolsをインストールします。

 

 

参考資料

 

/dev/randomと/dev/urandomの違いを調べていたらhavegedというのを入れていた - 以下省略!

 

virtio-rngのちょっとしたメモ · GitHub

 

Features/VirtIORNG - QEMU

 

暗号技術のすべてという本にまとまっていました。(上記サイトを見たあとにふと気がついて読んでみたらわかりやすくまとまっていました)

暗号技術のすべて

暗号技術のすべて

 

 

これから先、暗号がらみのプログラムをする人は増えていくと思いますが、上記の1冊あれば、暗号化技術に対してかなりの程度の知識が入ってくると思うのでおすすめです。

Rubyでethereumを送る方法

Ruby gemの

https://rubygems.org/gems/ethereum

を使ってEth(Nuko)を送信することに成功したので、悩んだ場所とその解決方法を書きます。

 

結論だけ言うと、送信数を指定するときに、to_twos_complementを使ってweiの値をHEX化する必要がありました。

 

gist.github.com

 

 全体的にはホストとポートの指定方法がわかれば使いやすいGemかなと思いましたが、send_transactionのパラメータの指定方法がわかりませんでした。

 

普通に

res = client.send_transaction('from'=> from_addr, 'to'=>to_addr, 'value'=> wei)

とやってしまうと、

{"jsonrpc"=>"2.0", "id"=>8, "error"=>{"code"=>-32602, "message"=>"invalid argument 0: cannot unmarshal non-string as hex data"}}

というエラーが出てしまい、送信出来ずにいたのです。

 

get_balanceで受け取ったデータがHEXだったので、ここで渡すパラメータもHEXにしないといけないのだろうと言うところまではわかったのですが、どうにも数字をHEX化するメソッドを見つけられずにいました。

ずっとformatter.rbの中をto_* とかfrom_*をながめていたつもりだったのですが、hexとasciiしかみていなくて、数日ほど悩みました。

ふと、引数にnumberを取るものという視点で探し始めて目についたのがto_twos_complementというメソッドでした。

そしてうまくいきました。

そういうわけで、ここに貼り付けたソースリストの22行目が今回の肝でした。

 

なお、ノードを立ち上げるときに--rpcapiにpersonalを含めないと

{"jsonrpc"=>"2.0", "id"=>8, "error"=>{"code"=>-32601, "message"=>"The method personal_unlockAccount does not exist/is not available"}}

というエラーが出ます。

 

英語でも情報がなかった感じだったので記録として残すことにしました。

 

rack::protectionではまった話

備忘録。

rack::protection::HttpOriginでattack prevent が出てpost出来なくて困っていて見つけた記事

 

Rack-protection and Nginx - sourcediver.org

 

nginxをリバースプロキシとしてアプリケーションサーバーに中継するときは、

nginxのconfigに

proxy_set_header X-Forwarded-Proto $scheme;
を追加することでうまくいった。