2018年12月24日月曜日

Hyperledger Fabric 暗号化機能を使ってみる

チェーンコードがワールドステートにKVS情報を登録する際、デフォルトでは平文で登録される。
Fabricが提供するチェーンコード関数(shim)において、暗号化・復号化関数を使ってKVS情報を暗号化・復号化してみる。

➀最初に、必要なパッケージをgovendorでインストールする。

# cd /opt/src/github.com/hyperledger/fabric-samples/chaincode/enccc_example
# go get github.com/kardianos/govendor
# govendor init
# govendor add +external
#  ls -l vendor/
合計 44
drwxr-xr-x. 22 root root  4096 12月 24 16:06 github.com
drwxr-xr-x.  5 root root    47 12月 24 16:06 go.uber.org
drwxr-xr-x.  3 root root    15 12月 24 16:06 golang.org
drwxr-xr-x.  4 root root    34 12月 24 16:06 google.golang.org
drwxr-xr-x.  3 root root    21 12月 24 16:06 gopkg.in
-rw-r--r--.  1 root root 39682 12月 24 16:06 vendor.json

②チェーンコードをインストールする。ここでは、Fabric付属のサンプルソースを利用する。

#peer chaincode install -n bushido -v 1.0 -l golang -p github.com/chaincode/enccc_example
#
# peer chaincode instantiate -o orderer.example.com:7050 -C bushido -n bushido -l golang -v 1.0 -c '{"Args":[]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')" --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem

③共通鍵を作成する。サポートしてる暗号アルゴリズムはAES 256bit。

# ENCKEY=`openssl rand 32 -base64` && DECKEY=$ENCKEY
#  echo $ENCKEY
hVhA7CxStLauw9/aLBnieoC9dM237fQHPvU8ibS1MyY=
#
# IV=`openssl rand 16 -base64`

➃データを暗号化してワールドステートに登録する。
transientオプションに暗号化鍵を指定する。暗号化鍵はワールドステートには登録されない。

# peer chaincode invoke -n bushido -C bushido -c '{"Args":["ENCRYPT","key2","value2"]}' --transient "{\"ENCKEY\":\"$ENCKEY\",\"IV\":\"$IV\"}" --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem

⑤復号化してワールドステートから値を取得する。
transientオプションに復号化鍵(=暗号化鍵)を指定する。

#  peer chaincode query -n bushido -C bushido -c '{"Args":["DECRYPT","key2"]}' --transient "{\"DECKEY\":\"$DECKEY\"}"
value2

ためしに、復号化鍵(DECKEY)に誤った値を指定した場合、以下のエラーが発生する。

・hogeとした場合
#  peer chaincode query -n bushido -C bushido -c '{"Args":["DECRYPT","key2"]}' --transient "{\"DECKEY\":\"hoge\"}"
failed: Failed importing key with opts [&{true}]: Invalid Key Length [3]. Must be 32 bytes"

・32バイトの適用な値を指定した場合
# peer chaincode query -n bushido -C bushido -c '{"Args":["DECRYPT","key2"]}' --transient "{\"DECKEY\":\"111222xStLauw9/aLBnieoC9dM237fQHPvU8ibS1MyY=\"}"

Error: endorsement failure during query. response: status:500 message:"getStateAndDecrypt failed, err Invalid pkcs7 padding (unpadding > aes.BlockSize || unpadding == 0)\nFailed decrypting with opts [&{[] <nil>}]\ngithub.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/bccsp/sw.(*CSP).Decrypt\n\t/chaincode/input/src/github.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/bccsp/sw/impl.go:303\ngithub.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim/ext/entities.(*BCCSPEncrypterEntity).Decrypt\n\t/chaincode/input/src/github.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim/ext/entities/entities.go:246\nmain.getStateAndDecrypt\n\t/chaincode/input/src/github.com/chaincode/enccc_example/utils.go:40\nmain.(*EncCC).Decrypter\n\t/chaincode/input/src/github.com/chaincode/enccc_example/enccc_example.go:76\nmain.(*EncCC).Invoke\n\t/chaincode/input/src/github.com/chaincode/enccc_example/enccc_example.go:182\ngithub.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim.(*Handler).handleTransaction.func1\n\t/chaincode/input/src/github.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim/handler.go:273\nruntime.goexit\n\t/opt/go/src/runtime/asm_amd64.s:1333"



0 件のコメント: