[Tip] MySQL의 password Hash 함수와 동일한 .NET 구현

[2014.03.18 Update] XpressEngine 1.5 버전에서 사용하는 구형 패스워드 해시 함수에 대한 내용을 업데이트하였습니다.

asp.net 기반의 프로젝트를 진행하면서 PHP나 MySQL 기반의 데이터베이스와 상호작용해야 하는 상황이 자주 있는데, MySQL의 password 함수를 사용하여 만든 Hash 기반의 Opaque Single Way 암호화 토큰을 비교해야 하는 때가 있습니다. SHA1을 사용하여 만드는 해시 결과 값이지만 명확한 결과와 구현 과정을 이해하기에는 쉽지 않아 같은 기능을 .NET으로 구현하는데에는 약간의 노력이 필요합니다. 정보 공유를 위해서, 그리고 개인적인 편의를 위해서 블로그 글로 간단히 팁을 올려봅니다.

출처: http://stackoverflow.com/questions/868482/simulating-mysqls-password-encryption-using-net-or-ms-sql

using System;
using System.Security.Cryptography;
using System.Text;

// 중략

public string CalculateHash(string key)
{
    byte[] keyArray = Encoding.UTF8.GetBytes(key);

    using (SHA1Managed enc = new SHA1Managed())
    {
        byte[] encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray));
        StringBuilder myBuilder = new StringBuilder(encodedKey.Length);

        for (int i = 0; i < encodedKey.Length; i++)
            myBuilder.Append(encodedKey[i].ToString(“X2”));

        return String.Concat(“*”, myBuilder.ToString());
    }
}

MySQL의 새 password API는 간단히 요약하면 .NET의 SHA1Managed와 거의 동일하며, 앞에 Asterisk를 붙이는 Behavior는 독자적인 것입니다. 이 기능을 사용하여 XpressEngine이나 다른 MySQL 기반 응용프로그램과 안전하게 크레덴셜을 공유하고 Single Membership 체제를 유지할 수 있습니다.

[2014.03.18 Update]

만약 구 버전의 XE 1.5의 Password Hash 함수를 필요로 하는 경우 다음의 코드를 대신 사용합니다.

<

p style=”margin-left:2em;”>public static string CalculateHash(string key)

        {

            byte[] keyArray = Encoding.UTF8.GetBytes(key);

            using (HashAlgorithm enc = new MD5Cng())

            {

                byte[] encodedKey = enc.ComputeHash(keyArray);

                StringBuilder myBuilder = new StringBuilder(encodedKey.Length);

                for (int i = 0; i < encodedKey.Length; i++)

                    myBuilder.Append(encodedKey[i].ToString(“x2”));

                return String.Concat(myBuilder.ToString());

            }

        }

댓글 남기기