MicroPython的午睡(113) ESP32版、hashlib使ってsha256を計算

Joseph Halfmoon

MicroPython上でも使えるCPython(フルのPython実装)のサブセット・モジュールを見てます。今回はhashlibとな。この年寄はMD5計算できればいいんじゃね、くらいのいい加減さ。ESP32版のMicroPythonみたらばMD5は割愛されてました。SHA256使え(SHA1もある)ということみたい。

※「MicroPython的午睡」投稿順 Indexはこちら

hashlib

シビアな用途でなくて、自分でファイルを読み書きする程度のアプリでもバージョンの不整合とか検出するのにハッシュなど計算するのがお楽。まあそんなときはMD5で十分かと。短いし。でも近代的なプログラムでは非推奨とな。

hashlibはMicroPythonでも実装されています。いつもお世話になっておりますMicroPythonの日本語版ドキュメントが以下に。

hashlib — ハッシュ化アルゴリズム

上記のページを拝見すると一応アルゴリズム的には以下3種が存在するようではあるのです。

    • SHA256
    • SHA1
    • MD5

しかし、SHA256はMicroPythonコアに含まれているのでどのポートでもサポート、SHA1はインターネットで使われることがあるので、ネットワーク接続想定のポートでサポートされるオプション、MD5は古いので相互運用上必要な場合のみサポートされる。。。てな書きぶりです。上から順ね。

今回使用してます ESP32版のMicroPythonで見てみると以下のようでした。ImportHashlib

WiFi搭載していてネットワーク接続がもれなく使えるESP32なのでSHA256に加えてSHA1をサポート、MD5は残念、という感じデス。

実験用のソースその1

実験は簡単にしました。MicroPythonのストレージにTEXTファイルを書き込み。その際にテキスト行からSHA256でハッシュを計算しておきます。後で、TEXTファイルを読み取って読み取りデータからSHA256を再計算して一致すればOK。アリガチな。以下はファイル書き込み時用。

import hashlib, binascii

def main():
    testSTR = "ESP32, store text file and calculate sha256 HASH."
    print(testSTR)   
    hash = hashlib.sha256()
    with open("hashTST.txt", mode='w') as f:
        f.write(testSTR)
        hash.update(testSTR)
    print(binascii.hexlify(hash.digest()))
            
if __name__ == "__main__":
    main()
実験用のソースその2

以下はファイル読み取り時用。

import hashlib, binascii

def main():
    testSTR = "ESP32, load text file and calculate sha256 HASH."
    print(testSTR)   
    hash = hashlib.sha256()
    with open("hashTST.txt", mode='r') as f:
        for lin in f:
            print("READ> ", lin)
            hash.update(lin)
    print(binascii.hexlify(hash.digest()))
            
if __name__ == "__main__":
    main()
読み書き実験

さて、上記のファイル書き込みプログラムを走らせたところが以下に。黄色のマーカ引いてあるのがSHA256ハッシュです。HashSaveM

つづいて、ファイル読み込みプログラムを走らせたところが以下に。読み取った行から計算したSHA256ハッシュがやはり黄色のマーカ部に。HashLoad

一応、一致しとるみたいですな。それこそホントはbtreeデータベースにでも登録しておいて後で比較すれば良いのだけれど。今回は(今回も)手抜き。

MicroPython的午睡(112) ESP32版、heapqで乱雑タプルを昇順にとりだす へ戻る

MicroPython的午睡(114) ESP32版、ヒープ・メモリの使用状況 へ進む