1.其实你这个地方可以这样做,每个登录时都判断一下用户是否已经验证,如果验证了就不用登录,注意登录只是一个验证的过程,如果登录过再去登录是不是不太合适
2.这个地方你可以使用一些类库中的函数进行一下机密处理,获得以后进行解密再提取键值。这是以前在网上找的一个加函数:
using System.Security.Cryptography;
#region Encryption64
private const string DEFAULT_KEY = "#kdsfsles";
public static string Encrypt(string stringToEncrypt, string key)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream;
// Check whether the key is valid, otherwise make it valid
CheckKey(ref key);
des.Key = HashKey(key, des.KeySize / 8);
des.IV = HashKey(key, des.KeySize / 8);
byte[] inputBytes = Encoding.UTF8.GetBytes(stringToEncrypt);
cryptoStream = new CryptoStream(memoryStream, des.CreateEncryptor(), CryptoStreamMode.Write);
cryptoStream.Write(inputBytes, 0, inputBytes.Length);
cryptoStream.FlushFinalBlock();
return Convert.ToBase64String(memoryStream.ToArray());
}
public static string Decrypt(string stringToDecrypt, string key)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream;
// Check whether the key is valid, otherwise make it valid
CheckKey(ref key);
des.Key = HashKey(key, des.KeySize / 8);
des.IV = HashKey(key, des.KeySize / 8);
byte[] inputBytes = Convert.FromBase64String(stringToDecrypt);
cryptoStream = new CryptoStream(memoryStream, des.CreateDecryptor(), CryptoStreamMode.Write);
cryptoStream.Write(inputBytes, 0, inputBytes.Length);
cryptoStream.FlushFinalBlock();
Encoding encoding = Encoding.UTF8;
return encoding.GetString(memoryStream.ToArray());
}
/// <summary>
/// Make sure the used key has a length of exact eight characters.
/// </summary>
/// <param name="keyToCheck">Key being checked.</param>
private static void CheckKey(ref string keyToCheck)
{
keyToCheck = keyToCheck.Length > 8 ? keyToCheck.Substring(0, 8) : keyToCheck;
if (keyToCheck.Length < 8)
{
for (int i = keyToCheck.Length; i < 8; i++)
{
keyToCheck += DEFAULT_KEY[i];
}
}
}
/// <summary>
/// Hash a key.
/// </summary>
/// <param name="key">Key being hashed.</param>
/// <param name="length">Length of the output.</param>
/// <returns></returns>
private static byte[] HashKey(string key, int length)
{
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
// Hash the key
byte[] keyBytes = Encoding.UTF8.GetBytes(key);
byte[] hash = sha1.ComputeHash(keyBytes);
// Truncate hash
byte[] truncatedHash = new byte[length];
Array.Copy(hash, 0, truncatedHash, 0, length);
return truncatedHash;
}
#endregion
3.这个可以上网找找,应该挺多的!
PS:可能我没有说清楚,这个hash只是hash一个key,这个key不用解密
使用时是这样的:string value= Encrypt("222","ID");同样解密string old =Decrypt(value,"ID");
不过这个确实存在楼下中提到的特殊字符问题,请参考他的链接文章
1.判断下只许可一个用户登陆
2.把id=222加密
3.google search
1、在Application里保存一个当前在线用记列表(至少包含用户名和SessionID)当用户登录的时候查这个列表,如果有这个用户的信息就删掉,再把现在登录的用户的信息写进去。(具体实现还有很多方法,不过原理应该是相通的)
2、这个意义可能不大~因为如果都是加密的那别人直接用加的地址访问不跟明文一样?如果你只是不想让人从URL猜到对就数据在数据库里的ID,只能生成链接的时候把参数都先加密,到服务器再解密出来(可以把所有参数一起加密,这样别人连有几人参数都不知道。如:?args=EF982423ACBAE234
这里面把你所有的参数都放进来到服务器再解密,难点应该在服务器获取参数上(可以写个基页专门解密这个参数)
3、我不知道哪有下~~我觉得关键是有个好的、高效的、可配置的脏字过滤方法吧。
个人看法,希望对你有所帮助。
1.你说的是先登陆的断线,那么在WEB环境下不容易实现,因为先登陆的那位事实上已经和服务器断开了,很难做到“即时”的下线,我的思路是这样的:登陆的时候将登陆时间写在cookie中,数据库中再保存一份最后登陆时间,如果当前cookie中的登陆时间比数据库中的早,就说明之后有其他登陆行为,因此此次登陆无效,系统自动退出此帐号。但即使这么做,也必须在用户下一次访问网站的时候才能实现注销的功能
2.你可以使用最简单的base64加密,但base64加密会加密出一些和URL冲突的符号,比如说"/"这个符号,因此淘宝使用的改进后的base64加密,你可以查看一下javaeye上的一帖http://www.javaeye.com/topic/286240 另外当然还能有对称加密和非对称加密等,加密应当在服务器端进行,使用JS加密是对客户端资源的一种考验,但是楼上的使用HASH方法加密,会无法解密,因此你将222的ID加密后再也无法知道这是222了……
3.脏字库可以网上找,我相信搜索一下会很多
1.不建议让第一个登录的自动掉线,因为可能存在被盗的情况,建议分两步,一提醒已登录者有人在用此帐号登录,二在新登录用户那边设置一个强制下线功能,而不是自动掉线.我们现在的系统采用的就是我说的第二点.
2.你自己都说加密了,用MD5之类的都行.
3.没搞过.你弄好了麻烦告诉我一声.job.chang@live.cn
第一个问题在web的情况下一般是不考虑的
如果非要考虑就是要有个在线列表
将用户id附加一个登录id 登录id根据随机数生成记录在线表中
然后当再次登录的时候制动清理以前的登录id
第二个
加密什么方法都可以这个无所谓
至于脏字那个
一般都是看效率了
在功能上没什么大问题