スプレッドシートにハッシュ関数を実装してみた【GAS】


セキュリティ系の勉強を進めているうちに一方向ハッシュ関数についても触れ、
実装してみたいなぁと思いGASで実装してみました。

といっても、GASが最強に便利すぎてハッシュ関数の命令文が用意されていたので、ほとんど何もしなくても実装できちゃいました。
さらにさらに、先人がわかりやすいコードも残してくれていたので脳死状態でSHA256を実現できました
すご。

実現したかったこと

「パスワードが記載されたシートをハッシュ化してCSVファイルに出力する。」

本当にそれだけです。なんとなくハッシュ後の値を別で保存するシートを用意していますが、実行するとどっちも更新されるので、認証的な効果は皆無です
ちょっと改良すれば、認証機能を持たせることができると思いますので、いつか暇があったら実装してみます。

コード内容

SHA256_GAS
function myFunction() {
  var currrentSheet = SpreadsheetApp.getActiveSheet();
  var targetSheet = SpreadsheetApp.openById("*************************").getActiveSheet();
  var targetLastRow = targetSheet.getLastRow();
  var currentValues = currrentSheet.getDataRange().getValues();

  var hashedRow; //ハッシュ化結果を保存

  for(var i=1;i<currentValues.length;i++){
    //ハッシュ化(SHA256)
    var raw = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, currentValues[i][0], Utilities.Charset.UTF_8); 
    hashedRow = mySHA256(raw);

    currrentSheet.getRange(i+1,2).setValue(hashedRow); //元シートにハッシュ値を出力
    targetSheet.getRange(targetLastRow+1,1).setValue(hashedRow); //別シートにハッシュ値を出力

    targetLastRow = targetSheet.getLastRow(); //最終行の更新
  }
  csvOut(targetSheet.getDataRange().getValues());  
}

function mySHA256(raw){
  var strHash = ''; //ハッシュ値の文字列
  var numHash = 0;  //ハッシュ値の数値

  for (i = 0; i < raw.length; i++) {
    numHash = raw[i];
    if (numHash < 0) { //ゼロ未満だったら
      numHash += 256;  //マイナスの除去
    }
    if (numHash.toString(16).length == 1) { 
      strHash += '0'; //1桁なら0をくっつける
    }
    strHash += numHash.toString(16); //16進数表記の文字列に変換
  }
  return strHash;
}

function csvOut(targetValues){
  //ファイル名生成
  var date = new Date();
  var toDay = Utilities.formatDate(date,"Asia/Tokyo","yyyyMMdd"); 
  var fileName = "SHA256_" + toDay;

  //csv出力の準備
  var csvOutput = targetValues.join('\n');
  var blob = Utilities.newBlob(csvOutput, MimeType.CSV, fileName + '.csv');
  var id = "*************************"; //フォルダID
  var folder = DriveApp.getFolderById(id);

  //CSVファイルを作成
  folder.createFile(blob);
}

myFunction関数はメイン処理を行うところで、mySHA256関数は文字列を取得して16進表記の文字列に変換、csvOut関数は指定したGoogleDriveのフォルダにcsv形式のハッシュ化データを保存する関数です。
細かい説明はコメントに残しています。(放棄)

実行結果

以下がパスワード一覧の元データです。
ちなみに、ここに書いているパスワードは日本人が設定しがちでかつ一瞬で打ち破られるパスワード一覧らしいです。
GASを実行するとB列にハッシュ値が出力されます。

こちらがハッシュ値を保存しておく別ファイルです。
このファイルをそのままcsvで出力します。

そしてこちらがCSVファイルの生成結果です。

関数モリモリで簡単にSHA256を実現できたので、
外部の怪しいハッシュ変換ソフトを使うくらいなら自分で作ったほうが良いかもしれませんね。
まぁ、そもそもこの結果がうまくいってるのかはわからんですが。