(windows版)
1,需要安装安当中间件,
2,在前端页面引用usbkey.js,这里含有获取UKEY中得编号,公钥等信息以及存用户信息
(注:使用UKEY之前,需要把UKEY得公钥存到数据库中,与用户对应,也需要把用户得主键存到UKEY中,这里需要单独后台管理员页面操作)
3,在登录过程中,先获取UKEY得主键信息(前端页面获取),把主键信息传到后台,根据主键信息在数据库查询,判断是否有此用户数据。
4,有用户数据时,则可获取用户对应得公钥信息,则进行验签操作
首先,在前台获取随机数,根据随机数生成得签名(这里生成签名的过程是调用安当的方法生成的),把这两个值传到后台中;
然后,在后台获取用户的公钥,对其进行验签,只有验签成功才能进行登录。不成功时会有提示。
其验签操作如下:
byte[] SJS = sha256("随机数");
string Sha256_abstract = BitConverter.ToString(SJS ); //sha256加密原始随机数(明文)获得摘要
byte[] sign = Convert.FromBase64String("签名");
byte[] ret = DecryptByPublicKey(sign, "公钥");
string PublicKey_abstract= BitConverter.ToString(ret); //公钥解密 base64解码签名后的数据 获得摘要
最后比对 Sha256_abstract 与PublicKey_abstract即可,相同则说明验签成功。
用到的方法:
sha256加密方法
public static byte[] sha256(string data)
{
byte[] bytes = Encoding.UTF8.GetBytes(data);
byte[] hash = SHA256Managed.Create().ComputeHash(bytes);
return hash;
}
RSA公钥解密方法
private static AsymmetricKeyParameter GetPublicKeyParameter(string s)
{
s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "");
byte[] publicInfoByte = Convert.FromBase64String(s);
Asn1Object pubKeyObj = Asn1Object.FromByteArray(publicInfoByte);//这里也可以从流中读取,从本地导入
AsymmetricKeyParameter pubKey = PublicKeyFactory.CreateKey(publicInfoByte);
return pubKey;
}
public static byte[] DecryptByPublicKey(byte[] byteData, string key)
{
//非对称加密算法,加解密用
IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());
//解密
try
{
engine.Init(false, GetPublicKeyParameter(key));
byte[] ResultData = engine.ProcessBlock(byteData, 0, byteData.Length);
return ResultData;
}
catch (Exception ex)
{
return null;
}
}