はてなキーワード: ハッシュ値とは
ビットコインマイニングは、ビットコインネットワークのトランザクションを確認し、新たなビットコインを生成するプロセスである。
これは数学的な問題を解くことによって行われる。具体的には、以下のようなステップが含まれる:
1. 新しいブロックの作成: マイナーは未確認のトランザクションから新しいブロックを作成。
2. ハッシュの計算: マイナーは新しいブロックのハッシュを計算。ハッシュ関数は、任意の長さのデータを固定長のハッシュ値に変換。ビットコインでは、SHA-256というハッシュ関数が使用される。
3. 難易度ターゲットの比較: 計算されたハッシュが難易度ターゲット以下であるかどうかを確認。難易度ターゲットは、ネットワーク全体のマイニングパワーに基づいて調整される。
4. ブロックの追加: ハッシュが難易度ターゲット以下であれば、そのブロックは有効とされ、ブロックチェーンに追加される。そして、そのブロックを作成したマイナーは新たなビットコイン(ブロック報酬)とトランザクション手数料を受け取る。
これらのステップを繰り返すことで、ビットコインマイニングは行われる。
僕はプログラミング歴2週間の初心者です。キーと値を入力できるデータベースを作っています。
以下のコードを実行してデータを追加し続けると、一定のサイズを超えるとエラーが出てしまうみたいです。
理想は、データが追加された後にサイズが足りなくなったら動的に自動拡大されることです。
もし詳しい人がいたらご教示お願い致します。
import sys import os import mmap import hashlib def h(x): return int(hashlib.sha512(x.encode()).hexdigest(), 16) def create_db(filename): with open(filename, 'wb') as f: f.write(b'\0' * 1024 * 1024) # 1MBの空ファイルを作成 def set_key(filename, key, value): with open(filename, 'r+b') as f: mm = mmap.mmap(f.fileno(), 0) pos = h(key) % mm.size() while mm[pos:pos+1] != b'\0': pos = (pos + 1) % mm.size() if pos == h(key) % mm.size(): f.seek(0, os.SEEK_END) f.write(b'\0' * mm.size()) # ファイルサイズを2倍にする mm = mmap.mmap(f.fileno(), f.tell()) # ファイルサイズを反映させる pos = h(key) % mm.size() # ハッシュ値を再計算する data = key + '\0' + value + '\0' data = data.encode() mm[pos:pos+len(data)] = data mm.close() # mmapオブジェクトを閉じる def get_key(filename, key): with open(filename, 'r+b') as f: mm = mmap.mmap(f.fileno(), 0) pos = h(key) % mm.size() while mm[pos:pos+1] != b'\0': end = mm.find(b'\0', pos, mm.size()) # 第2引数と第3引数を指定する if end == -1: end = mm.size() if mm[pos:end].decode() == key: pos = end + 1 end = mm.find(b'\0', pos, mm.size()) # 第2引数と第3引数を指定する if end == -1: end = mm.size() value = mm[pos:end].decode() mm.close() # mmapオブジェクトを閉じる return value pos = (pos + 1) % mm.size() if pos == h(key) % mm.size(): break mm.close() # mmapオブジェクトを閉じる return None def main(): cmd = sys.argv[1] if cmd == 'create': create_db(sys.argv[2]) elif cmd == 'set': set_key(sys.argv[2], sys.argv[3], sys.argv[4]) elif cmd == 'get': print(get_key(sys.argv[2], sys.argv[3])) if __name__ == '__main__': main()
異常な幻想の網に捕らわれ、PTSDの闇に沈んでおり、仕事からの離脱を余儀なくされております。
その幻想は、あまりにも鮮烈であったため、現実か夢か、いまだに疑念が拭えぬものとなりました。
認識の糸が紡ぎとどけず、安定した現実がどこに棲むのか、それを問い詰めざるを得ません。
思考の結晶を抽象的な形に仕立て上げ、それを操ることは、極めて魅力的であり、しかも財政的な負担は一切生じません。
傷病手当金の恩恵に浴しており、感謝の念に堪えません。その支給期間が続く限り、職場の扉を閉じる覚悟でおります。
この転向した日記は、"勉強日記"のカテゴリーからの移行でございます。
"勉強日記"という名は、絶え間ない学びを要求されるという、何とも重苦しい響きがあったため、精神的な疲弊を感じておりました。
"廃人日記"の名に変えることで、統合失調症の患者が日々の苦闘を語る場として、うってつけでございます。
真正性の保証のために、特別なプロセスにより、内容にハッシュ値を刻み付けることに決意いたしました。
他のブログプラットフォームも一縷の望みを託しましたが、結局、匿名性の高いダイアリーが最も筆が進むようでございます。
私は、被害妄想に囚われると、コンテンツを一掃する衝動に駆られますが、匿名ダイアリーはその記録が永遠に残るという、安心感をもたらしております。
hash: 38d8d7e05e9f40a04eec8e6da9f768a3
俺:
javascript言語で、現在時刻のタイムスタンプからMD5のハッシュ値を出力する関数、timeToMd5 を作ってください
JavaScriptでは、次のような関数を作成することができます。
function timeToMd5() { // 現在時刻のタイムスタンプを取得します const timestamp = Date.now(); // ハッシュ値を出力するために、MD5ライブラリをロードします const md5 = require('md5'); // timestampを文字列に変換し、それをMD5ハッシュ値に変換して出力します const hash = md5(timestamp.toString()); return hash; }
このような関数を作成することで、現在時刻のタイムスタンプからMD5のハッシュ値を出力することができます。
ご参考までに。
俺:
nodeコマンドで実行しましたが、"Error: Cannot find module 'md5'" というエラーになってしまいました。なにか解決方法がありますか?
ご質問のように、JavaScriptで定義した関数を実行すると、"Error: Cannot find module 'md5'" というエラーが発生しているようです。
このエラーが発生する原因は、JavaScriptのコード内で、MD5ライブラリをロードしようとしたときに、そのライブラリがインストールされていないためです。
JavaScriptのコードで、MD5ライブラリを利用するには、まず、そのライブラリをインストールする必要があります。
インストールするには、次のように、nodeコマンドを実行します。
$ npm install md5
このコマンドを実行することで、MD5ライブラリがインストールされ、JavaScriptのコードから利用することができるようになります。
また、JavaScriptのコードを実行するには、次のようにnodeコマンドを使用します。
$ node [JavaScriptのファイル名]
このようにすることで、JavaScriptのコードを実行することができます。
ご参考までに。
俺:
ありがとうございます。実行できました😁
おめでとうございます!ご質問いただいた内容について、正しく解決されたようで嬉しいです。
もしまだご質問があるようでしたら、お気軽にお問い合わせください。今後とも、Assistantをご利用いただけますよう、よろしくお願いいたします。
まぁ、下っ端プログラマには要らないだろうけど、いわゆるシステムエンジニアとかアーキテクトとか言われるレベルの仕事するには、なるべく知っとかないといけないよね。
オレの場合は、大学はかろうじて理系の一角だったけど、学問的にコンピュータサイエンスを学んだことはなくて、某IT会社でなかば業務上の必要に迫られ、なかば趣味的な興味本位もありで、ちょっとずつ勉強した。
で、もう20年くらい前だし、すでに廃止されてる(と思う)ので、守秘義務違反とかの面倒なことにならなそうだと想定してぶっちゃけると、大手携帯会社のショップで各店舗独自のプロモーション打ったりするためのWebシステムの開発に関わったことがある。
顧客の(および自分とこの)エライ人なんかに、システムの設計の根拠(この方式が最善なのか?もっと安く早くやれる方法はないのか?などなど)を常に問いかけられ、説明説得しなきゃならない。そこでコンピュータサイエンスに基づいて理路整然と話をすると、ちゃんと信頼してもらえるし、納得してカネ払ってもらえるw
そこで使ったのが、以下のような各種理論だ:
などなど... 自分史上最高に残業させられたこの仕事やってた年の年収は、900万円台おしくも1000万には届かなかったねぇw
--追記--
コンピュータサイエンスがらみの思い出でもう一個面白い(とオレが思う)ネタがあるので、ついでに書いとこうw
これは、上で書いた携帯会社のシステムよりだいぶ前のことになるが、とあるグループウェアの開発に関わってたとき、メールをFAXに向けて出力するドライバを書いたことがある。昔のことなのでオープンソースもあんまり普及してないし、タダでお手軽に使えるライブラリが見つからなかったので、「車輪の再発明」っぽいけど自分でハフマン符号化によるデータ圧縮のアルゴリズムを勉強して作ったのだ。
Win32のAPIとか呼び出して、ビットマップにテキストを描画させたとこから、ドットをちまちま数えて、白のドットがいくつ続いてたらこのコード、黒がいくつ続いてたらあのコード...って可変長のビットパターンをつなぎ合わせてファイルに書き出す...みたいな。これが理論通りにうまいこと動作して、FAXから文書が出てきた時はとっても楽しかったw
RStudioがPC内から気がついたら消滅していたので何回もやり直すのが面倒で書いた
コメントアウトをいじればFedoraやmacOSでも動くと思う
https://pastebin.com/HiPqLVq7 (6/4 shコマンドでも動くように修正 以前はbash hogehoge起動していたので動作確認していなかった)
エラーでここに貼れなかった
util-linux(rev) libxml2-utils(xmllint) gpg curl coreutils(sha256sum)とR関連
echo "$HTML" | xmllint --nowarning --xpath hogehoge --html - | hogehoge
こうしないとxmllintがエラーでhtlmなどをうまく読み取らない
sed 's/href="//g;s/"//g;s/\s/\n/g;s/^.?$//g;s/^\n//g'
href="hogehoge"の形で出てxmllint内で除去出来なかったのでsedで妥協
hrefが1回しか出ないのでひとまとめにできそうだが面倒なので分けた
この書き方なら複数回出ても除去できるはず
先頭の謎のスペースの除去が面倒だった
echo "$HASH" "$FIELNAME" | sha256sum --status -c ;echo $?
スペースが2つないと書式で怒れられてハッシュ値が合っていてもsha256sumが終了ステータス0で正常終了を返してくれない
VScodium
ShellCheck
https://open-vsx.org/vscode/item?itemName=timonwong.shellcheck
XPath Helper
https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl
zenn.devに書こうか迷ったがどちらの方が良かったのだろうか…
ダウンロードしたサーバーがやられてるならハッシュ値も改ざんするだろうgpgで確認しないと意味ないでしょとかsudoでやったらディレクトリがとか色々ガバあるから誰かいい感じに改良して
https://cran.rstudio.com/bin/linux/debian/
1か月ほど前まで初代第1世代Core iのPCをほぼノーマルで使っていたが、Windowsの肥大化(*1(本増田の最後に参考webページを記載。以下同様))のせいかweb閲覧やExcel操作程度の作業でも引っかかりを覚えるようになったり、Windows11ブームに煽られてセキュリティ関連の記事を読み古いCPUには脆弱性が付き物だと知った(*2・3・4)り、あれこれあったためPCを新しくすることにした。
その際に色々な知見を得て情報の更新ができたため、日記帳兼リンク集として増田に残しておくことにした。極少数の人にしか役に立たないであろう文章だが、体験談の類として暇つぶしに読んでもらえれば幸い。ただ、過去のPC事情を懐古したりするのが目的なら、数年前にホッテントリ入りした別の記事(*5・6)を読む方が有意義かもしれない。
まず、パーツの買い方を3種類に大別して検討した。
この前段階で格安の中華製ミニPC(*7)も候補に挙げていたが、拡張の厄介さや商品到着までの時間の長さを難に感じて選択肢から外した。
今新しく自作PCを組むなら鉄板の構成だと思う。現在の相場では、M/B 13k円、Celeron 7k円、DIMM2枚組 6k円、SSD 200GB 4k円で約3万円くらいになるだろう(*8・9・10)。構成品のどれかを中古にすれば2万円台前半で抑えることもできそうだ。
しかしながら、最近まで骨董品で我慢できた身には過剰スペックになりそうだという懸念と逆張り志向のせいでRyzen APUに惹かれたためとで、この組合せは除外した。
時機を見極めて個々のパーツを買えれば、安く挙げることができる方法だろう。
だが、動作不良品・リマーク品(*11)・その他の不動品(*12)等を掴むリスクやピン折れ曲り(*13)他機器不良への対処を避けるため、この組合せも選ばなかった。
M/B・CPU・ビープスピーカー・電源があれば動作検証は可能だ(*14)。そのことは前提知識として通用してるだろうと期待し、ジャンクな出品物・者を弾けば少なくとも直ぐに判明するような不良品を掴むことは避けられるだろうと考えて、セット品を軸にパーツ調達することにした。
ただ、個別のパーツだけ欲しいと思う人が多いせいか、希望に叶う出品は少なかった。値段や特定のパーツへのこだわりは捨てて条件をだいぶ緩くしたが、それでも購入作業を終えるには結構な時間がかかった。
作業の結果以下のパーツが手に入った。これら以外にも試用して直ぐ売却したものがあるが、その分は少々の損失で済んだため、実質合計費用は25k円+10k円。
元の電源が10年以上持ったので、5年前の製品なら後5年は使えるだろうと考え、中古で済ませることにした。
参考になるまとめ記事を元に、経年による劣化が小さいと思われる、電圧と電流の波形が綺麗な製品(*15)を候補にした。5年以上前に発売された商品を1年少々しか使っていない状態良好品だと嘯く詐欺師がフリマには跋扈しているが、そういう輩を除外しても選択肢が十分にあるのは幸いだった。プラグイン電源という危険そうな製品(*16)以外に無難な選択肢が無かったのは、老害な増田には難だったが。
余談だが、電動ブロワーは電源の清掃にとても役立った(*17)。騒音が問題にならない環境の人には是非お勧めしたい。
大型のファンを備えた電源ユニットをケース下部に置く組み方が主流になって久しいようだ(*18)が、冷却や静音にこだわる必要が無いのでケースは流用することにした。ただ、電源LEDがそのままでは機能しないので、オス-メスのジャンパワイヤー(デュポンケーブル)をフリマで買ってピンとコネクタをつないだ(*19)。
マザーボードについては色々調べたが、8ピンのATX 12V電源コネクタ(*20)が一般化して久しいことや、フェーズ数の増加(余談だが、I/O電圧とコア電圧が異なるデュアルボルテージは、30年近く前にモバイル版P54Cで初めて採用された)(*21・22)といった電源回りのことで特に知ることが多かった。光物(*23)はあまり興味が無いのでほぼスルーした。
RyzenもIntel Coreもどちらも魅力的だと思った(*24・25)が、結局はAMDで組むことにした。そこそこのGPUを省電力で使えることが大きかった。
メモリは多少勉強した(*26)つもりでパーツ選定に着手したが、チップセットの16Gbitチップ対応事情(*27)を全く把握していなかったため、相性問題にぶつかって最初に購入したパーツセットを買換えることになった。容量について言うと、16GBだとたまに心許なくなるが32GBだと過剰という感がある。Intelなら24GB(8+16の2枚)載せて16GB分をデュアルチャネルモードで使える(*28)ので、その点は良いなとも思う。
SATA SSDでも体感速度は悪くない(*29)という言説を見て、安く手に入ったSSDで十分と判断した。記録方式がTLCかどうかといった商品選択の時に普通ポイントになる点(*30)は、次に買換えたくなった時に気にかけようと思う。
光学ドライブも電源ユニットと同様、本来は5年程度で買換えるべき製品とされている(*31)が、それはそれとして、電源と同様の理由で5年くらい前の中古品を探そうかと思って調べてみたら、M-DISCという規格(*32)があると知った。対応するドライブやメディアを購入すると割高だ、余計に金をかけてまで保存すべきデータはどれだけあるか、そもそも光学メディアの読み書きをする機会はどれだけあるか(*33)等、あれこれ考えた結果光学ドライブは買わないことにした。
最近は無音でPCに向かうことが専らなので、USB-DACを排除してHDMIモニタのイヤホン出力で済ませることにした。気まぐれに音楽を聴きたくなったらヘッドフォンアンプをライン出力につないで使おうと思う。
ケースと一緒に死蔵品を引っ張り出した。文字入力を業としない立場なのでキーボードは何でもどうでも良い。
マウスはクリックが利き辛くなったので放置してたが、分解修理可能(*34・35・36)だと知ったので実例(*37)を参考に簡単に清掃して使えるようにした。マウスホイールは部品交換が必要な状態(ホイールのゴム部分が、加水分解して汚れてたので重曹で洗った(*38)ら、完全に溶けてなくなってしまった)なので、そのうちAliExpressで補修品(MX300適合品ではないが、サイズが同じもの)(*39)を購入しようと思う。
初めは旧システムの入ったHDDを新しいM/Bにつないで使っていた。後で中身をSSDにクローンしようと考えたが、安物のSSDゆえガンガン書き込むことを必要以上に避けなくても良いなと思い直したので、結局新規インストールすることにした。
Raven RidgeではWindows11にアップグレードできない(*40)。だが、Windows11ではGPUが重くなりその対策が未だ無いよう(*41)なので、Windows10のままで良いということにした。
Windows7の頃はUEFIで起動しないPCがまだ一般的(*42)だった。このHDDもそういうPCに接続されてたのでフォーマットはMBRだった。CSMを有効にすればそのままで起動できるが、そうできるのは古いGPUを使っている時で現行のiGPUではたいてい無効にされる(*43・44)。CSMは頼りにせずGPTに変換して使うのが無難だ。
変換の際はWindows10のUSB起動メディアでmbr2gptを使ったが、ReAgent.xmlの更新に失敗したというエラーメッセージが出たので、回復パーテーションを弄って(「コンピュータの管理」ではドライブレターを付与できないのでdiskpartを使った)修正した(*45・46)。
Microsoftアカウントで常用していたためかライセンスの再認証を求められることも無く、上記の問題を除けばほぼすんなりと使用できた。セクターにアライメントのずれが無いかどうか(*47)も調べたが、問題無かった。
VMWare上で予行した分も含めて何回もした。セットアップを繰り返した理由は、Administratorを有効にしパスワードを設定しないままメインアカウントを標準ユーザーにしたらAdministratorにログインできなくなって(*48)詰んだり、OneDriveの動作選択画面で「このPCにのみファイルを保存する」を選択せず「次へ」移動したら戻れなくなった(ドキュメントやピクチャ等のフォルダパスをOneDriveに指定した後で、再度ローカルストレージに変更するのは割と手間になる)(*49・50)り、システムファイルを移動させようとして次節で説明するようにシステムを破壊したりしたためだ。
SSDの容量節約と書込み抑制のため、ページ、スワップ、ハイバネーションの各ファイル・OneDriveフォルダ(ただし、空フォルダにマウントしたドライブは移動先に指定できない)・ユーザプロファイルフォルダ下のドキュメント等のフォルダ・AppDataフォルダ下のRoamingフォルダとLocalフォルダの一部・テンポラリフォルダ・ストアアプリフォルダを移動(*51・52・53・54)した。Superfetchはデフォルトで良しとした(*55)。
かつては別アカウントでログインしてプロファイルフォルダを全部移動しジャンクションを貼って使うこともできたが、Windows10のあるバージョン以降でそれをするとスタートメニュー他ショートカットやストアアプリが即死する(*56)。一部のシステムファイルが変化するとメニューやアプリ全体が損壊判定されるようだ(十分な検証はしてないが、container.datやハッシュ値が名前になってるファイルを弄ると不味いように感じた)(*57)。こうなるとアカウントを消して再作成する他無くなる。ちなみにCドライブ直下のProgramDataフォルダ等を壊すともっと悲惨で、新規インストールくらいしか回復の手立てが無かった。
https://b.hatena.ne.jp/entry/1 または https://b.hatena.ne.jp/entry?eid=2(それぞれ、数字部分がeid)のような形式のurlを入力すれば、当該ブックマークエントリーにアクセスできる。
*1 | Windows 10はバージョンアップを重ねるたびに本当に遅くなっているのか?検証結果はこんな感じ - GIGAZINE | https://gigazine.net/news/20210622-windows-10-version-slow-down/ | 4704430589992224258 |
*2 | Googleが発見した「CPUの脆弱性」とは何なのか。ゲーマーに捧ぐ「正しく恐れる」その方法まとめ | https://www.4gamer.net/games/999/G999902/20180105085/ | 373991174 |
*3 | AMDのプロセッサに脆弱性、セキュリティ企業が情報公開--懐疑的な見方も - CNET Japan | https://japan.cnet.com/article/35116106/ | 360332677 |
*4 | インテルとARMのCPUに脆弱性「Spectre-v2」の悪夢再び、新たな攻撃手法 | TECH+ | https://news.mynavi.jp/techplus/article/20220312-2290634/ | 4716634065497432514 |
*5 | 「Sandy Bridgeおじさん」とは何か? : 因画応報 | http://ingaoho.ldblog.jp/archives/4916067.html | 362560793 |
*6 | ありがとう鼻毛鯖 8年使った鼻毛鯖をついに買い替えました | 日本霜降社 | https://nihonsoukou.com/20181123/1827 | 4665750545042615426 |
*7 | 2万円の超格安パソコン「GREEN G2」値下げ、高性能CPUに大容量メモリやSSD採用で仕事でもプライベートでも大活躍 | Buzzap! | https://buzzap.jp/news/20220318-trigkey-green-g2-ultra-low-price-pc-happy-price-down-3/ | 4716943171239004674 |
*8 | 第12世代インテル Core プロセッサー 特集 | パソコンSHOPアーク(ark) | https://www.ark-pc.co.jp/special/intel-12th-gen-core-series/ | - |
*9 | 8GBモジュール | 2枚組 | DDR4 DIMM (288pin) | デスクトップ用 | 通販・価格/性能比較一覧 | 価格の安い順 | パソコンSHOPアーク(ark) | https://www.ark-pc.co.jp/search/?col=3&order=&p1=b21010&p2=c21050&p5=s21010&p6=w11726 | - |
*10 | 〜256GB | M.2 | SSD | 通販・価格/性能比較一覧 | 価格の安い順 | パソコンSHOPアーク(ark) | https://www.ark-pc.co.jp/search/?col=3&order=&p1=b32020&p2=c32024&p5=s32220 | - |
*11 | 【やじうまPC Watch】中国でIntel CPUの偽造品出回る。公式が注意を呼びかけ - PC Watch | https://pc.watch.impress.co.jp/docs/news/yajiuma/1248215.html | 4684567815854719490 |
*12 | Lenovoに搭載されているAMD CPUにベンダーロックが設定されているせいで中古市場が混乱している - GIGAZINE | https://gigazine.net/news/20220118-lenovo-vendor-lock-amd-cpu/ | 4714151541045747810 |
*13 | ASCII.jp:冗談ではなく目の前が真っ暗になる恐怖……ピンを曲げてしまったRyzen 9 5950Xの修復を試みる (1/3) | https://ascii.jp/elem/000/004/053/4053723/ | 4703873313928579106 |
*14 | パソコンが起動しない場合の確認方法|テックウインド株式会社 | https://www.tekwind.co.jp/ASU/faq/entry_31.php | 4666842797243724258 |
*15 | 【自作PC】電源ユニットの選び方を自作経験者がガチ解説する | ちもろぐ | https://chimolog.co/bto-choose-psu/ | 367187040 |
*16 | 何故プラグイン式PC電源ユニットのコネクタは規格統一されていないのか? - Togetter | https://togetter.com/li/1564076 | 4688976497965880706 |
*17 | ブロワーの選び方 | DIY工具紹介部 | https://diytool.biz/blois | 170335990 |
*18 | “冷却の常識”を徹底検証 - AKIBA PC Hotline! | https://akiba-pc.watch.impress.co.jp/docs/dosv/662237.html | 364049132 |
*19 | PCケースのPower LEDケーブルを3ピンから2ピンに変換した | TeraDas | https://www.teradas.net/archives/16603/ | 4705898232067265346 |
*20 | 20ピン ATX 電源は 24ピンのマザーボードに使えるのか – 分かりにくい ASUS マニュアルと ATX 電源の規格 | Nire.Com | https://www.nire.com/2009/10/atx-24pin-motherboard-vs-20pin-power/ | 75424033 |
容量超過のため、anond:20220419200228 に続く。追記もあり。
①
一部サイトは文字制限でいつものが使えないのでその場で適当に入れて再ログインのたびに再発行
②
同じパスワードの使いまわしがだめっていうからいつもの+末尾にサービス名
masuda_no_password+hatena
masuda_no_password+google
みたいな感じ
③
平文保存してるサービスの多さを知って②のパターンだと使いまわし部分が簡単にわかって無意味と気づく
getPassword()
サービスやアカウントごとには変えておきたい感もあったので引数を使うことにした
getPassword("hatena.masuda3")
getPassword("yahoo.masuda1")
④
平文保存してたところでまずみないだろうと気づく
それぞれ別パスワードにしたいけど覚えたくないしパスワードマネージャーは嫌い
単純にやると同じことやる人がいそうなので、いつものキーワード+ログインIDを初期値として誕生日数分繰り返しハッシュ値を求めることにした
使ってる文字種別や文字数で文句言われたくないので、ハッシュ値に Aa1_ をプレフィックスにつけて前から要求される最大文字数分切り出したものをパスワードにした
Aa1_295ae0f759fe6f348346d4ba0484
パソコンがあればログインIDといつものキーワードだけで求められるがパソコンがないところでログイン出来ないことに気づく
はてなで時々話題になってるけど、受託開発で企業向けなもの作ってると割と普通にある
ユーザ向けよりもエラー起きたときの原因究明とか求められるし本番でもデバッグモードで動かして全ログ出したりとかもある
ログイン出来ないんですけどの回答に「登録されていたパスワードは『password』ですが、入力されたパスワードは『password 』で末尾にスペースが含まれているためにログインに失敗していました」みたいな返答が普通にあるわけ
一般ユーザ向けだとパスワード間違ってるんじゃないですか?リセットしてみてくださいとかで済む
実際自分がユーザとしてなんだったかのサービスを使ったときメールが届かないので問い合わせたらこっちのサーバは動作してるのでGoogleとかメールサービス側に問い合わせてくださいみたいなこと言われたことがある
それくらい雑なものでよければいいんだけど変に要求されるからパスワードは平文でログにもパスワードが含まれるとかも当たり前になる
あとそういえば一般に公開してるものだけどログインではなくハッシュ値使ったURLを個人のマイページにしてたりもあった
URL知らないから他の人は見れないけど知っていれば誰でも見れるってやつ
一部の人はありえないとかいいそうだけど個人的にはURL知らなければアクセスできないは非公開と言ってもいい気はしてるけどね
youtube の限定公開とか gist のプライベートとかでもURL知ってる人しか見れないものを非公開みたいな扱いでつかってるし
URL知ってたら見れるってそれはパスワード知ってれば見れるも一緒
数十文字のハッシュ値を見つけるより人によっては10文字もないパスワードのほうが総当りで当たる確率高いよ
そんな感じで文化の違いとかを感じたって話
DBを設計する場合、パスワードのカラムを何文字にするか決めなければならない
これを最大2万文字とかにできなくもないが、DB容量を圧迫するといった理由で8文字や10文字に限定していてもおかしくはない
MongoDBのようなオブジェクトDBなら別だがSQL系のDBならこの理由が最もあてはまりそうに思う
同様の理由で文字種にも制限をかけてそう(UTF-8とか送られたら面倒)
境界値テストとしては最大文字数を試さないといけないが無制限だとそれができなくなる
100文字でテストするとなると、仕様としては100文字が限界ということになって文字数制限をかけることになる
ただ、それなら8文字とかで制限している理由として弱い気がする
無制限ということは極端に言うと1GBのパスワードを受け付ける、ということになる
1GBのハッシュ値を計算するのはブラウザ側になるのだが、1GBのハッシュ値計算が重くて使えない、という苦情が来るかも知れない
ただ、これも1000文字とかにしてしまえば良くて、8文字にしている理由にはならない
ウォーターフォールで実装する場合に上位レイヤでの仕様を決めるのはプログラマーでない場合が多く
定型のエクセル仕様書に「パスワードの最大文字数」というセルがあって、そこにデフォルトで8という数字が入っている
上位レイヤで仮にそこに100とか1000とかの数字を入れたとき、下位レイヤで何が起こるかわからない
つまりそこに8と書いた人が現代にいるのではなく、誰も決定していないから文字数制限が起きている
下位レイヤでの実装側は平文保存の危険性を十分に理解しているのでハッシュ値(とソルトなど)を格納する
多分、仮説4だと思うが、仮説1でないことを信じたい。
暗号化っていうのは
「情報の正しさを照合できる」
っていう技術
なので
っていうのは嘘で
が正しい
平文を暗号化してサーバに保存している場合は、結局は鍵をサーバに預けているので、信頼情報がユーザの手を離れてしまっている
って言われても家の鍵を大家に預けているのと同じ状態で家の中に100億円置いてるような人だと信用に足らない
じゃぁ例えばユーザにその鍵を預けておいて、認証の度に渡すようにしよう!なんていうことをやっても
鍵はデジタル情報だから簡単にコピー可能(追跡不可能)なので一度でも渡したら信用価値はゼロになる
ちなみにこれはハッシュ化でも同じ話で、ハッシュ値をサーバに保存していても平文を送りつけてハッシュ値をサーバで計算していたら意味が無い
ユーザ側でハッシュ値を計算して送りつける方法なら多少は意味があるけれど、結局は鍵がハッシュ値に変わっただけなので通信傍受されたらダメ
なのでダイジェスト認証っていう仕組みを使うので興味がある人は調べて欲しい
ということで、暗号化をしても結局は鍵の扱いに困ることになる
ログインで知りたいのはパスワードそのものではなくて「パスワードを知っているかどうか」だけ
なので、ハッシュ化を使って「パスワードを知っていたらハッシュ値も当然知ってるよね・・・?」っていう感じの認証を行う
ここで大事なのはハッシュ化っていうのは秘匿情報はユーザの側にあってサーバ側に渡していない、ということ
なのでプログラムをこねくり回しても原理的には元のパスワードは分からないしそれが基本
そこに「でも単純なパスワード使ってる人がいるかも?」「使い回している人がいるかも?」っていう悪知恵で攻撃してくる人がいるので
あと、秘匿情報がユーザ側にある、といってもどうせスマホとかPCに保存されているのでそっちをクラックされると漏洩する
なので基本的に鍵は脳内に保存した文字列か生体認証、もしくはデバイス認証を使う
この辺はパスワードマネージャーを使っていてもマスターパスワードが必要になるのと同じ
ここまでがセキュリティ講習の1日目の午前中の話
前提として、サーバ側のDBの中身が漏洩したと同時に、プログラム、設定ファイル、丸ごと全部漏洩したとみなしている。
プログラムがDB上のパスワードをどのように処理してるか丸見えになる。
複合できるということは、プログラムの手の届く場所に鍵があるということ。
その鍵がユーザごとに違っていようが関係ない。そのプログラムを通せば複合できるわけだから。
複合した結果、元のパスワードを「瞬時に」出せる。
その元のパスワードを使って、正規のユーザのフリをして悪いことができる。
さてハッシュの場合、bcryptなどではソルト付きハッシュ値になってる。
ハッシュなので「時間をかければ」、そのハッシュ値になる値を検索できる。
元のパスワードと同一であるかどうかはわからない。(同一でなければバレる可能性が高まる)
ここである程度時間を稼げるので、サーバ管理者側にサービスを停止したり、パスワードを全部向こうにするような時間の余裕ができる