Yuri’s Tech Note

技術系アウトプット

digest認証

digest認証とはまずブラウザからサーバへユーザ名やパスワードなどをそのまま送らずに、その場で生成したランダムな文字列などとともにハッシュ値に変換してから送る。
サーバ側では予め登録されたユーザ名・パスワードなどから同様の手順でハッシュ値を計算し、両者が一致すれば認証成功とみなす認証方法のこと。

ハッシュ値に変換して送信する処理

function getHash(pw) {
    const salt = 'xxxxxxxxxx'
    const crypto = require('crypto')
    const hashsum = crypto.createHash('sha512')
    hashsum.update(pw + salt)
    return hashsum.digest('hex')
}

入力されたパスワードにsaltを付加してハッシュ関数SHA-2のバリエーションのうちの1つであるSHA-512方式で暗号化した後、16進数でハッシュを返却。


ソルト
パスワードの前後に付加することで予め任意の文字列をハッシュ値に変換しておき、標的のパスワードのハッシュ値と比較することでパスワードを推察するレインボー攻撃の対策となる。

crypto
暗号化標準モジュール

sha512
暗号学的ハッシュ関数
入力値に対し、常に同じ値を出力する。
入力値から同じ値を算出するのは簡単だが、その逆、結果から元の値を導き出すのは難しい。
HA-2はSHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256の6つのバリエーションを持ち、ハッシュ長は224、256、384、512ビットのいずれか。

function addUser(userid, passwd, callback) {
    const hash = getHash(passwd)
    const token = getAuthToken(userid)
    const regDoc = {userid, hash, token, friends: {}}
    userDB.insert(regDoc, (err, newdoc) => {
        if (err) return callback(null)
        callback(token)
    })
}

function login(userid, passwd, callback) {
    const hash = getHash(passwd)
    const token = getAuthToken(userid)

    getUser(userid, (user) => {
        if (!user || user.hash !== hash) {
            return callbask(new Error('認証エラー'), null)
        }
        user.token = token
        updateUser(user, (err) => {
            if (err) return callback(err, null)
            callback(null, token)
        })
    })
}

ユーザーを登録する際にハッシュとトークンをDBに保存しておく。
ログインする際にはユーザーのハッシュが一致しなければ認証エラーとする。
ハッシュが一致した場合はトークンを更新する。

ハッシュはログイン後の行動の中で認証が必要になった際に使用する。