java passport_Passport 通行证 整合

using System;

using System.Security.Cryptography;

using System.Text;

///

/// c#与discuz的passport整合事例

/// 请保留以下信息以备出现问题时使用

/// 整合贡献:huozhe3136 QQ:2666556

/// 调试工具:Microsoft Visual Web Developer 2005

///

public partial class _Default : System.Web.UI.Page {

//------------------------需要修改的设置---------------------------------

string webUrl           = "http://localhost:1627/webapp/Default.aspx";//这里修改为你的测试主站的地址,不要缺少最后的'/'号

string dzUrl            = "http://localhost:8080/discuz/";//这里修改为你的dz地址,不要缺少最后的'/'号

string dzPassportKey    = "1234567890";//这里修改为你的dz后台通行证设置里的possportkey

string dzForward        = "";

string dzAuth           = "";

string dzVerify         = "";

protected void Page_Load(object sender, EventArgs e){

dzForward = Request.QueryString["forward"];

if (Request.QueryString["act"] == "logout") logout();

if(Session["username"]!=null) Response.Write(Session["username"].ToString()+ "登陆成功! 点击这里退出登陆 访问论坛
");

}

protected void logout(){

Session["username"] = null;

dzForward           = Request.QueryString["forward"];//获取返回地址

if (dzForward == "") dzForward = webUrl;//如果返回地址为空,则返回设置的页

dzVerify            = md5("logout" + dzForward + dzPassportKey);

dzForward           = Server.UrlEncode(dzForward);

Response.Redirect(dzUrl + "api/passport.php?action=logout&auth=&forward=" + dzForward + "&verify=" + dzVerify);

}

protected void Button1_Click(object sender, EventArgs e){

string postUsername;

string postPwd;

postUsername        = username.Text.ToString().Trim();

postPwd             = password.Text.ToString();

if(postUsername=="admin" && postPwd=="123456"){

Session["username"]=postUsername;//设置主站自身的cookie或session;

//---------------------------passport注册或登陆整合开始-----------------------------

string memberInfo = "username=" + postUsername

+ "&password=" + md5(postPwd)

+ "&time="+ time()//获取当前时间与格林威治的秒差

+ "&email="+"abc@abc.com";//需要email的值,实际整合通常情况是从数据库里获取用户email

dzAuth          = passport_encrypt(memberInfo , dzPassportKey);

dzForward       = forward.Value.ToString().Trim();//获取返回地址

if(dzForward=="") dzForward = webUrl;//如果返回地址为空,则返回设置的页

dzVerify        = md5("login" + dzAuth + dzForward + dzPassportKey);

dzAuth          = Server.UrlEncode(dzAuth);

dzForward       = Server.UrlEncode(dzForward);

Response.Redirect(dzUrl + "api/passport.php?action=login&auth=" + dzAuth + "&forward=" + dzForward + "&verify=" + dzVerify);

//---------------------------passport注册或登陆整合结束-----------------------------

}else Response.Write("登陆失败
");

}

//------------------------------------以下为一些关键函数------------------------------

// 将字符串转换为byte数组

public byte[] strToByteAry(string str){

return Encoding.Default.GetBytes(str);

}

// c# dz通信证编码函数

public string passport_encrypt(string txt, string key){

byte[] randomNumber = new byte[1];

RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();

Gen.GetBytes(randomNumber);

int rand = Convert.ToInt32(randomNumber[0]);

string encrypt_key = md5(rand.ToString());

byte[] txtAry = strToByteAry(txt);

byte[] encryAry = strToByteAry(encrypt_key);

int j = 0;

int ctr = 0;

byte[] tmp = new byte[2 * txtAry.Length];

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

{

ctr = ctr == encryAry.Length ? 0 : ctr;

tmp[j++] = encryAry[ctr];

tmp[j++] = xor(txtAry[i], encryAry[ctr++]);

}

return Convert.ToBase64String(passport_key(tmp, key));

}

// c# dz通行证解码函数

public string passport_decrypt(string txt, string key){

byte[] t = Convert.FromBase64String(txt);

byte[] btxt = passport_key(t, key);

byte[] btmp = new byte[btxt.Length];

int j = 0;

for (int i = 0; i < btxt.Length; i++, j++)

btmp[j] = xor(btxt[i], btxt[++i]);

return Encoding.Default.GetString(btmp);

}

// c# dz通行证密匙处理函数

public byte[] passport_key(byte[] btxt, string key){

key = md5(key);

byte[] keyAry = strToByteAry(key);

int ctr = 0;

byte[] tmp = new byte[btxt.Length];

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

ctr = (ctr == keyAry.Length) ? 0 : ctr;

tmp[i] = xor(btxt[i], keyAry[ctr++]);

}

return tmp;

}

// 针对byte的异或

public byte xor(byte a, byte b){

return Convert.ToByte(a ^ b);

}

// 获取UNIX时间戳

public string time(){

DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));

DateTime dtNow = DateTime.Parse(DateTime.Now.ToString());

TimeSpan toNow = dtNow.Subtract(dtStart);

string timeStamp = toNow.Ticks.ToString();

timeStamp = timeStamp.Substring(0, timeStamp.Length - 7);

return timeStamp;

}

// md5加密

public string md5(string str){

MD5 md5Hasher = MD5.Create();

string re="";

byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(str));

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

re += data[i].ToString("x2");

return re;

}

}

PGP是目前最优秀,最安全的加密方式。这方面的代表软件是美国的PGP加密软件。这种软件的核心思想是利用逻辑分区保护文件,比如,逻辑分区E:是受PGP保护的硬盘分区,那么,每次打开这个分区的时候,需要输入密码才能打开这个分区,在这个分区内的文件是绝对安全的。不再需要这个分区时,可以把这个分区关闭并使其从桌面上消失,当再次打开时,需要输入密码。没有密码,软件开发者本人也无法解密!PGP是全世界最流行的文件夹加密软件。它的源代码是公开的,经受住了成千上万顶尖黑客的破解挑战,事实证明PGP是目前世界上最安全的加密软件。它的唯一缺点是PGP目前还没有中文版,而且正版价格极其昂贵。因为PGP技术是美国国家安全部门禁止出口的技术。汉化中文版的PGP我还没有发现过。 PGP (Pretty Good Privacy) 是一个可以让您的电子邮件 (E-Mail) 拥有保密功 能的程式。藉此您可以将您的邮件加密 (Encrypt) ,除了您希望的人看得到以外, 没有其它人可以解读。一但加密后,讯息看起来是一堆无意义的乱码 (Random Characters) 。PGP 提供了极强的保护功能,即使是最先进的解码分析技术也无法解 读 (Decrypt) 加密后的文字。 PGP 加密与解密不像其它传统加密的方式,而是利用所谓的公开钥匙密码学 (Public Key Cryptology) 为基础。举例来说,当您要传送一封保密信或档案给笔者 时,必须先取得笔者的公开钥匙 (Public Key) ,并且将它加入您的公开钥匙环 ( Public Keyring) 中,然后利用笔者的公开钥匙将信件加密。当笔者收到您加密的信 件后,笔者必须利用其相对的私人钥匙 (Secret Key) 来解密。因此,除非其他人拥 有笔者的私人钥匙,否则无法解开您所加密的信件。同时,笔者在使用私人钥匙解密 时,还必须输入通行码 (Pass Phrase),如此又对加密后的讯息多了一层保护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值