Updated : January 2011
DekiWiki authtokenの構成
authtokenの構成
authtokenは、以下のような値をとっており、「_」で区切られた3つの構成要素から成り立っている。
authtokenの例)
1_633626670308750000_4dc277cc9ca098442ef3fb2cea34893d
構成要素
(1)ユーザID
(2)西暦1年1月1日を起点とした100ナノ秒単位のタイムスタンプのシリアル値(18桁)
時刻は、authtokenが生成されたユニバーサルタイム
UNIX系の西暦1970年1月1日を基点とするには、「621355968000000000」を減算する。
(3)ハッシュ値(32桁)
ユーザID、時刻、パスワード、APIキーを使用してWindowsのGuidクラスでハッシュされる。
ハッシュ方法
(1)(ユーザID)_(タイムスタンプシリアル値18桁).(符号化パスワード).(APIキー)
符号化パスワード usersテーブルuser_password列に格納されている
符号化のロジックは、Passwordの符号化 を参照
APIキー configテーブルのconfig_key="security/api-key"のconfig_value列の値
SELECT config_value FROM config WHERE config_key="security/api-key";注)mindtouch.deki.startup.xmlに記述されているapi-keyではない。
(2)上記文字列をMD5でハッシュ
(3)Guidのコンストラクタに上記バイト列を使用
(4)「-」を取り除いた文字列(32桁)をハッシュ値として使用
ハッシュにWindowsのGuid(グローバル一意識別子)を算出するロジックを使用しており、外部で算出する場合は、C#での実装が必要となる。(VBで試算した結果同一の値が取得できた。)
確認用VBコードサンプル
Public Class authtoken
Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles calcButton.Click
Dim userid As String
Dim passwd As String
Dim timest As String
Dim apikey As String
Dim tokenContext As String
Dim pwdEncoded As String
Dim contentToValidate As String
Dim authtoken As String
Dim hash As String
userid = Me.inUserid.Text
passwd = Me.inPasswd.Text
timest = Me.inTimest.Text
apikey = Me.inApikey.Text
tokenContext = userid & "_" & timest
pwdEncoded = MD5_HASH(userid & "-" & MD5_HASH(passwd))
contentToValidate = tokenContext & "." & pwdEncoded & "." & apikey
hash = New Guid(md5.ComputeHash(System.Text.Encoding.Default.GetBytes(contentToValidate))).ToString("N")
authtoken = tokenContext & "_" & hash
Me.outAuthtoken.Text = authtoken
Dim utc As New DateTime(timest, DateTimeKind.Utc)
Me.outTimest.Text = utc.ToLocalTime().ToString("yyyy/MM/dd (ddd) HH:mm:ss.fffffff")
End Sub
Private Function MD5_HASH(ByVal src_txt As String)
Dim bytHashCode() As Byte
Dim BytData As Byte
Dim bytOriginalText() As Byte
Dim MD5_STR As String = vbNullString
bytOriginalText = System.Text.Encoding.Default.GetBytes(src_txt)
bytHashCode = md5.ComputeHash(bytOriginalText)
For Each BytData In bytHashCode
MD5_STR &= Microsoft.VisualBasic.Right("0" & Hex(BytData.ToString), 2)
Next
Return LCase(MD5_STR)
End Function
End Class