実現したいこと
https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF
unicode表によると「aiueo」は「0x0061006900750065006f」となるようですが
unicodeに則らなくても何進数であろうと構いませんのでバッチで数値化を実現したいです。
また、その逆も変換できるようにしたいです。
背景
特定の数名のユーザのためにバッチファイルを作成していますが、
その中にはDBへの接続情報が書かれてしまっています。
ユーザーには秘匿したいのですが、当然メモ帳等で開かれると一発アウトです。
最初はexe化することで回避を考えていましたが、諸事情によりNGになりました。
そこでハッシュ関数を利用する方法を思いつきました。
https://qiita.com/tsumita7/items/fe8ca1a77a3678d1717b
こちらのハッシュ関数を元に、以下のようなことを実現しようとしています。
- ユーザーにこのシステム専用のパスワードを作成してもらい尋ねる
- 教えていただいた私はその値を数値化する
- 数値化したパスワードをハッシュ関数に通す
- DBの接続生情報も同様に数値化し、3の結果と排他的論理和をとる。この値をバッチファイル内にベタ書きしてユーザーに渡す
- ユーザーはバッチ起動時に1のパスワードを入力する
- バッチの中でそのパスワードを数値化→ハッシュ化し、その値とベタ書きされた値と排他的論理和をとると「DBの接続生情報が数値化されたもの」が出てくるのでそれを文字列に戻してDBに接続する
前提
- セキュリティの都合上windows標準に入っていない仕組みの利用は不可
- バッチのライブラリ等もNG
- python等ももちろんNG
- 3rd partyツールもNG
- powershellもNG
- ユーザーがwiresharkやメモリ解析ツールで見れば生情報普通に見れるんじゃ・・・は気にしなくていい
試したこと
ひとまずChatGTPに頼ってみましたがうまく動きませんでした。
bat
1@echo off 2setlocal enabledelayedexpansion 3 4set "input=aiueo" 5set "output=" 6 7for /f "delims=" %%a in (`cmd /u /c "echo %input%"`) do set "input=%%a" 8 9for /l %%i in (0,1,100) do ( 10 set "char=!input:~%%i,1!" 11 if "!char!"=="" goto :done 12 for /f "tokens=2 delims=:=" %%A in (`chcp`) do ( 13 set /a "char_code=0x!char!" 14 set /a "char_code=char_code %% 0x10000" 15 set "output=!output! !char_code!" 16 ) 17) 18 19:done 20echo %output%
cmdというコマンドがないのは分かったのですがどう直せばいいのか分からず。。
> セキュリティの都合上windows標準に入っていない仕組みの利用は不可
> powershellもNG
なぜ、PowerShell もダメなのでしょうか?
バッチファイルの機能だけでご質問のようなことを実現するのは無理です。
PowerShellなどがOKなら望みが出てきますが、そうするとユーザがそれを使って他の何かよからぬことをしかねないという懸念があるのでしょう、一般職員が使う業務用のマシンでPowerShellなどを無効にしている事業所はよくありますね。
できないことではありますが一応書いておくと、おっしゃっている手順のうち「数値化」というのは特に必要ないです。コンピュータではすべてのデータを数値として扱い、文字列も例外ではありません。ハッシュ関数の適用から後の演算が処理の本質的な内容です。
自分で試したことないので分からないですが、ユーザ側バッチファイルは
①ユーザが入力したパスワードを一時ファイルに保存
②`CertUtil -hashfile <一時ファイルのパス> <好きなハッシュアルゴリズム>` でハッシュ値生成
③一時ファイルとかfor /f経由で②を取得してDB接続に使用
でいけるかもしれないですね
念のために書いておきますが、
参考にしたというサイトでは、certutil を使ってハッシュを出力しています。そこは理解されていますか。
certutil は一応Windowsに付属しているツールではありますが、これも「バッチのライブラリ等」に当たりますか。
もっとも、これを使っていいとなっても、排他的論理和の処理をする方法がないので、やはりだめですね。
何が使えるか・使えないのの説明が不明瞭です。
①「セキュリティの都合上windows標準に入っていない仕組みの利用は不可」が明瞭ですが、
③「python等ももちろんNG」④「3rd partyツールもNG」は①で不可と言明済みですので、補足ですね(書かなくても同じ意味)。
これらと違い、⑤「powershellもNG」ですが、これはWindows標準ですが何故駄目なのか??
また、ikedasさんの確認事項にありますが、②「バッチのライブラリ等もNG」も意味不明です。
③や④と同じく①の補足なので無視しして良いのか、⑤のように①と別の追加条件の何かを言わんとしているのか?要は、
「バッチの組み込み機能だけしか使えない(exeなど起動不可)」
「バッチからWindows標準の機能は呼び出して良い」
のどちらかの確認です。前者は非常に奇異なルールなのでまず無いとは思いますが、そうだとすると②は何を言いたいのか?後者なら①があるので、②の記述は不要。
⑤ですが、もしかして「powershellの実行ポリシーの設定変更がNG」の間違いでは?
もしそうなら、(勘違いしている人が多いのですが)実行ポリシーがデフォルトのままでもPowershellスクリプトは実行可能なので、Powershellを使う方法も検討してはどうでしょうか?
あるいは、VBScriptという選択肢もあります。これはいずれ廃止という噂もありますが。OfficeもOKならVBAもあり。
> ユーザーがwiresharkやメモリ解析ツールで見れば生情報普通に見れるんじゃ・・・は気にしなくていい
ユーザーがバッチファイルを改ざんして接続情報を取得する可能性も気にしないですか?
何をするバッチか分からないですが、DB側に適切な権限を与えたDBユーザーを用意した方がよさそう...
