IT技術サポート総合サイト
 
 言語:  VC++/MFC   PHP/Perl   VB/VBA   ASP/ASP.net   HTML/CSS   基本知識:  Windows   Linux   ネットワーク   MySQL   レンタルサーバ   SEO対策
キーワード: RSS2.0配信
 
 
コラム集:パスワードの暗号化
←前コラム    目次    次コラム→    
 
sample
分類:VC++/MFC     著者:a000000403     更新日付:2010/02/13
 
 
CString
CCryptMD5::convMD5( CString m_passWord )
{
    BYTE mbuf[32]="";
    strcpy( (char *)mbuf, m_passWord );

    DWORD dwDataLen = (DWORD)strlen((char*)mbuf) + 1;

    HCRYPTPROV hProv;

    if( !CryptAcquireContext( &hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0 ) )
    {
        // デフォルトキーコンテナを作る
        if(!CryptAcquireContext(
              &hProv,               // ハンドルが戻る
              NULL,                 // CSPを利用するユーザー名
                                    // ログインユーザーの場合は NULL
              MS_DEF_PROV,          // MicrosoftのデフォルトCSP
              PROV_RSA_FULL,        // 利用方法(ハッシュ計算や案儀化の計算)
              CRYPT_NEWKEYSET))     // キーコンテントへのアクション
        {
            m_passWord ="ERR_Context";
        }
        else
        {
            m_passWord ="ERR_Acq";
        }
    }

    if( m_passWord == "ERR_Context" )
    {
    }
    else
    {
        HCRYPTHASH  hHash;
        if( !CryptCreateHash(
                hProv,          // CSPのハンドル
                CALG_MD5,       // ハッシュ計算のアルゴリズム
                0,              // 
                0,              // 
                &hHash ))       // ハッシュオブジェクトのハンドル
            m_passWord ="ERR_CreateHash";
        else
        {
            if( !CryptHashData(
                     hHash,                       // ハッシュオブジェクトのハンドル
                     mbuf,                        // 計算の元となるパスワードデータ
                     strlen((const char*)mbuf),   // パスワードのバイト長
                     0 ))                         // デフォルトのCSPを使う場合は、0
                m_passWord ="ERR_CryptHash";
            else
            {
                HCRYPTKEY  hKey;
                if( !CryptDeriveKey(
                         hProv,             // CSPのハンドル
                         CALG_RC4,          // 暗号化のアルゴリズム
                         hHash,             // 鍵に使用するハッシュオブジェクト
                         CRYPT_EXPORTABLE,  // 鍵の長さ
                         &hKey ))           // 暗号化用の鍵が戻る
                    m_passWord ="ERR_DeriveKey";
                else
                {
                    if( !CryptEncrypt(
                           hKey,          // 暗号化鍵オブジェクトのハンドル
                           0,             // 暗号化だけの場合は、0
                           TRUE,          // 大量のデータを扱う場合のみ変更
                           0,             // 
                           mbuf,          // データのポインタ
                           &dwDataLen,    // 平文のデータ長
                           31  ))         // バッファのバイト長
                          m_passWord ="ERR_Encrypt";
                    else  m_passWord = mbuf;
                }
                CryptDestroyKey(hKey);          // 暗号化キー
            }
        }
        CryptDestroyHash(hHash);                // Hash
    }
    CryptReleaseContext(hProv, 0);              // CSP

    return m_passWord;                          // 暗号化パスワードまたはエラーコード
}
 
 
←前コラム    目次    次コラム→