博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用C# 实现 Zen Cart 的用户密码加密算法
阅读量:5872 次
发布时间:2019-06-19

本文共 2026 字,大约阅读时间需要 6 分钟。

首先看下zencart的原代码在includes\functions\password_funcs.php文件中。

 

验证密码是否正确:

// This function validates a plain text password with an encrpyted password
  function zen_validate_password($plain, $encrypted) {
    if (zen_not_null($plain) && zen_not_null($encrypted)) {
// split apart the hash / salt
      $stack = explode(':', $encrypted);

      if (sizeof($stack) != 2) return false;

      if (md5($stack[1] . $plain) == $stack[0]) {

        return true;
      }
    }

    return false;

  }

 

密码加密

// This function makes a new password from a plaintext password.
  function zen_encrypt_password($plain) {
    $password = '';

    for ($i=0; $i<10; $i++) {

      $password .= zen_rand();
    }

    $salt = substr(md5($password), 0, 2);

    $password = md5($salt . $plain) . ':' . $salt;

    return $password;

  }

 

举个例子:

用户密码是:123456,对应的md5(UFT8 encode)值为 E10ADC3949BA59ABBE56E057F20F883E ,并且,随机数假设为 F2。

那么zencart存到数据库的密码应该为:  E10ADC3949BA59ABBE56E057F20F883E:F2

 

这里需要强调的是,研究PHP zencart的md5函数用的encode是UTF8格式的。

 

这里列出C#代码的md5加密算法(encode 采用UTF8格式):

        /// <summary>
        /// Encrypts a string to using MD5 algorithm
        /// </summary>
        /// <param name="val"></param>
        /// <returns>string representation of the MD5 encryption</returns>       
        public  string EncodeToMD5String(string str)
        {
            // First we need to convert the string into bytes, which
            // means using a text encoder.
            Encoder enc = System.Text.Encoding.UTF8.GetEncoder();

            // Create a buffer large enough to hold the string

            byte[] unicodeText = new byte[str.Length];
            enc.GetBytes(str.ToCharArray(), 0, str.Length, unicodeText, 0, true);

            // Now that we have a byte array we can ask the CSP to hash it

            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] result = md5.ComputeHash(unicodeText);

            // Build the final string by converting each byte

            // into hex and appending it to a StringBuilder
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < result.Length; i++)
            {
                sb.Append(result[i].ToString("X2"));//这里输出大写,要是写成x2,则输出小写
            }

            // And return it

            return sb.ToString();
        }       

像这种MD5+SALT的方法,逻辑都暴露了,安全性也就这样了,增加麻烦罢了。

怎么增加安全性了,大家可以讨论下。

 

转载于:https://www.cnblogs.com/webfpc/archive/2012/02/09/2343810.html

你可能感兴趣的文章
cakephp2.0 Utility class 简介
查看>>
HTML5移动Web开发指南
查看>>
单例类
查看>>
阿里云 linux 挂载数据盘
查看>>
我的友情链接
查看>>
H3C telnet 配置
查看>>
IE下监听滚轮
查看>>
崛起于Springboot2.X之redis集群搭建(17)
查看>>
浅说责任链,装饰者
查看>>
团部培训笔记-设计模式-《2013-11-27 代理模式》
查看>>
PHP高手之路
查看>>
PHP 图片上传类 缩略图
查看>>
使用Leaflet创建地图拓扑图
查看>>
我的友情链接
查看>>
自动化运维框架
查看>>
FTP服务器管理和配置
查看>>
开源,并不意味着免费、开源,不是道德绑架
查看>>
无线传输测试方法
查看>>
大话射手座!
查看>>
mysql基础教程
查看>>