主婦と.NETと犬のぶろぐ

奥様 と プログラム と お犬様 の 楽しい日常

目次

Blog 利用状況

ニュース

書庫

日記カテゴリ

MD5 の実装について調べてみた

なんだかアプリケーションのセキュリティ強化絡みの仕事がまわってきそうなので、
色々勉強しないとなぁと思っています。

とはいっても 赤間さんの本 ばかり眺めているとだんだん眠くなってくるので、
前の案件で特定のフィールドを MD5 で暗号化する要件があったのを思い出し、
最初に MD5CryptoServiceProvider を使ってお手軽に暗号化したものの、
複合復号化をあーじゃこーじゃやってうまくいかない。うがー。
へんてこな文字列が帰ってきたり、例外吐いたりして
もう嫌じゃーとなってきたので、10 行でズバリ!! を眺めてました。
そしたら、TripleDESCryptoServiceProvider を使っていたので
マネてそれを使ってうにゃうにゃやって、一応実装できました。

他言語での MD5 による暗号化/複合復号化の実装はどんな感じなのかなぁと思って検索したら
こんなのを見つけました。すごいぞ javascript。ワタシは好きじゃないけど。
JavaScript MD5

たぶん使わないけど一応自分用メモとしてコード書いておきます。

# 追記
# なちゃさんと凪瀬さんその他大勢のご指摘により、以下のコードはインチキな事が判明しました。
# もっと精進しないと...

Public Class MD5Test
    ''' 
    ''' MD5 によるハッシュ化(was 暗号化)←嘘
    ''' 
    ''' 暗号化する文字列
    ''' パスワード
    Public Function Encrypt(ByVal plainText As String, Optional ByVal pass As String = "") As String
        Dim provider As System.Security.Cryptography.TripleDESCryptoServiceProvider = _
        New System.Security.Cryptography.TripleDESCryptoServiceProvider()
        Dim p As System.Security.Cryptography.PasswordDeriveBytes = _
        New System.Security.Cryptography.PasswordDeriveBytes(pass, New Byte(-1) {})
        With provider
            .IV = New Byte(7) {}
            .Key = p.CryptDeriveKey("RC2", "MD5", 128, New Byte(7) {})
        End With
        Using memStream As System.IO.MemoryStream = New System.IO.MemoryStream(plainText.Length * 2)
            Using ctream As System.Security.Cryptography.CryptoStream = _
                            New System.Security.Cryptography.CryptoStream(memStream, _
                            provider.CreateEncryptor(), _
                            Security.Cryptography.CryptoStreamMode.Write)
                Dim plainBytes As Byte() = System.Text.Encoding.Default.GetBytes(plainText)
                ctream.Write(plainBytes, 0, plainBytes.Length)
                ctream.FlushFinalBlock()

Dim encryptedBytes As Byte() = New Byte(CInt(memStream.Length) - 1) {} memStream.Position = 0 memStream.Read(encryptedBytes, 0, CInt(memStream.Length)) Return Convert.ToBase64String(encryptedBytes) End Using End Using End Function
''' ''' 解読(was 復号化) ''' ''' MD5によるハッシュ(was 暗号)化されたBase64エンコード文字列←嘘 ''' パスワード Public Function Decrypt(ByVal base64Text As String, Optional ByVal pass As String = "") As String Dim provider As System.Security.Cryptography.TripleDESCryptoServiceProvider = _ New System.Security.Cryptography.TripleDESCryptoServiceProvider() Dim p As System.Security.Cryptography.PasswordDeriveBytes = _ New System.Security.Cryptography.PasswordDeriveBytes(pass, New Byte(-1) {}) With provider .IV = New Byte(7) {} .Key = p.CryptDeriveKey("RC2", "MD5", 128, New Byte(7) {}) End With Dim encryptedBytes As Byte() = Convert.FromBase64String(base64Text)
Using memStream As System.IO.MemoryStream = New System.IO.MemoryStream(base64Text.Length) Using ctream As System.Security.Cryptography.CryptoStream = _ New System.Security.Cryptography.CryptoStream(memStream, _ provider.CreateDecryptor(), _ Security.Cryptography.CryptoStreamMode.Write) ctream.Write(encryptedBytes, 0, encryptedBytes.Length) ctream.FlushFinalBlock()
Dim decreptedBytes As Byte() = New Byte(CInt(memStream.Length) - 1) {} memStream.Position = 0 memStream.Read(decreptedBytes, 0, CInt(memStream.Length)) Return System.Text.Encoding.Default.GetString(memStream.ToArray()) End Using End Using End Function End Class

投稿日時 : 2007年9月28日 16:24

Feedback

# re: MD5 の実装について調べてみた 2007/09/28 17:49 なちゃ

>MD5の復号
んなむちゃな…

# re: MD5 の実装について調べてみた 2007/09/28 18:42 Mr.T

Mr.Tです、こんにちは。
JavaScriptでのMD5ってどこかで見たなー
とおもったら、
http://www.onicos.com/staff/iz/amuse/javascript/expert/
デモもありますね。


# re: MD5 の実装について調べてみた 2007/09/28 19:33 凪瀬

復号…?

# re: MD5 の実装について調べてみた 2007/09/28 22:00 なおこ(・∀・)

>> なちゃさん、凪瀬さん
あれ?もしかして物凄い恥ずかしい事を書いていますか?
このへんの技術について、ホント全然知らないもので、、、

>> Mr.T さん
おお、そこワタシも見たです。
世の中には凄い人がいっぱいいますね。

# re: MD5 の実装について調べてみた 2007/09/28 22:46 なちゃ

複合じゃなくて復号…
ってのはまあ置いといて…

ハッシュとか一方向ハッシュとかとMD5で調べたらどういうことか分かるかと。

# re: MD5 の実装について調べてみた 2007/09/28 22:58 凪瀬

MD5は一方向ハッシュなので逆変換は不可能です。
その性質を利用して、パスワードなどをMD5でハッシュ化して保管したりします。
生パスワードはわからないけど、MD5でとったハッシュ同士を比べれば同じものが入力されたかどうかはわかるという仕掛け。

# re: MD5 の実装について調べてみた 2007/09/29 0:04 なおこ(・∀・)

>> なちゃさん、凪瀬さん
度々アドバイスありがとうございます。

検索したら、あいやー。。。
http://www.wakhok.ac.jp/~kanayama/summer/05/ipv6/node94.html

http://www.hyuki.com/cr/cat_hash.html

ハッシュ値は衝突することもあるし、
解読しようとすること自体がナンセンスなのですね。
暗号化という表現もちょっと微妙な感じがしてきました。

テストデータにハッシュ化された値があって
凪瀬さんがおっしゃったみたくハッシュ同士で比較しているロジックがあり、
なんとかこの元の値がとれないものか???
と思った事があったのですが、
一方向ハッシュ関数が生成した値を復元しようとすることはナンセンス。

エントリしたコードはなんでうまくいったんだろう??
ちゃんとハッシュ化されていなかったのかな?
まぐれのまぐれでうまく行っただけなのかしら?

# re: MD5 の実装について調べてみた 2007/09/29 0:27 やまだ

> TripleDESCryptoServiceProvider
を使ってますよね?
えーと、これは Triple DES (3DESと書かれることもある) という暗号方式のためのクラスなんです。
なので、3DES で暗号化して、3DES で復号やってると思います。

ハッシュは暗号化とは違います。一緒に語られることの理由の一つには電子署名との絡みもあったりしますが、コメントで書くようなこっちゃないですね。(さすがにここで書くのはきつい……)
わたしでよければざっとまとめてみますけど。

# re: MD5 の実装について調べてみた 2007/09/29 0:30 やまだ

ごめんなさい。私がコメント書いたとたん、Firefox での表示が崩れました。orz
# IE では大丈夫っぽいですが。
なんかやらかしたかなー?

# re: MD5 の実装について調べてみた 2007/09/29 9:56 凪瀬

やまださんの暗号講座にwktk

# re: MD5 の実装について調べてみた 2007/09/29 13:34 なおこ(・∀・)

>> やまださん
> わたしでよければざっとまとめてみますけど。
凪瀬さんと同じく是非お願いします!

# re: MD5 の実装について調べてみた 2007/09/29 23:55 やまだ@勉強会からの帰宅中

了解です。じゃあ準備します。
この際だからちょっとちゃんと資料つくろうか思い始めたり。
明日中にはアジェンダぐらいあげたいと思ってます。
とはいっても、別に専門家というわけでもないので、過度の期待はしないようにお願いしますね。
#検索した方が早くて的確って話もある(^^,

>やまださんの暗号講座にwktk
何言ってるんですか、凪瀬さんは私がぐだぐだになったときのサポート役ですよ(保険 とも言う)。
私が凪瀬さんに教えられることなどないっ!

# re: MD5 の実装について調べてみた 2007/09/30 0:11 中博俊

するどい突っ込み担当

# re: MD5 の実装について調べてみた 2007/09/30 0:57 やまだ

> するどい突っ込み担当
で、ツッコんだ分は責任をとっていただいて、代わりに説明をしていただければ。

……ということは、私はネタふり担当ということで。

# re: MD5 の実装について調べてみた 2007/09/30 13:34 なおこ(・∀・)

>> やまださん、中さん
お手すきの時にでも。
宜しくおねがいします^^

# re: MD5 の実装について調べてみた 2007/10/01 0:25 やまだ

とりあえず始めてみましたー。
http://blogs.wankuma.com/yamada/archive/2007/09/30/98786.aspx
いや、そんな話は良いから、というツッコミもありの方向で。

# re: MD5 の実装について調べてみた 2007/10/01 9:33 Moo

OneWayなハッシュなのよー


と書こうと思ったらもう盛り上がっていた件。

# re: MD5 の実装について調べてみた 2007/10/01 11:54 凪瀬

> 私が凪瀬さんに教えられることなどないっ!

技術は習うんじゃない!盗むんだッ!
というわけで、隙を伺います。

# re: MD5 の実装について調べてみた 2007/10/01 20:24 なおこ(・∀・)

>> やまださん
すばらしい。
ひとり勉強会じゃなくて、ここに参加者がおりまする。

>> Moo さん
> OneWay
知れば知るほど、なちゃさんの最初のコメントが心に響きました。

>> 凪瀬さん
わ、ワタシにも盗ませてっ!

タイトル  
名前  
Url
コメント