用kotlin写一个token的生成和校验
能用代码说的话,我不喜欢用文字来过多的描述。所以我就直接上代码了。用于token的生成和校验objectHyAuth{过期constvalstatusTimeOut0错误的tokenconstvalstatusWrong1状态正常constvalstatusOk2域名vardomain:Stringjiaohongyun。cn作者varauthor:Stringhyjiao应用名varapp:StringMyapp密钥varsecurity:Stringssas1919119ssas过期时间(7天)varvalidityInMs36001000247funinitAuth(config:HyAuth。()Unit){this。config()}funcreateToken(id:String,inData:()MutableMapString,String{mutableMapOf()}):String{valnowSystem。currentTimeMillis()valheaderHyHeader(domain,author,app)valpayloadHyPayload(id,inData())valfooterHyFooter(securitynow)payload。customItems〔creatAt〕now。toString()payload。customItems〔expiresAt〕(nowvalidityInMs)。toString()valgsongson()valstr1EncryptUtil。en4Base64(gson。toJson(header))valstr2EncryptUtil。en4Base64(gson。toJson(payload))valstr3EncryptUtil。md5(str1)EncryptUtil。md5(str2)EncryptUtil。sha256(gson。toJson(footer))returnstr1。str2。str3}返回状态funauth(token:String):Int{valstrstoken。split(。)if(strs。size!3){token被篡改returnstatusWrong}else{valstr1EncryptUtil。de4Base64(strs〔0〕)valstr2EncryptUtil。de4Base64(strs〔1〕)valstr3strs〔2〕valgsongson()valheadergson。fromJson(str1,HyHeader::class。javaObjectType)valpayloadgson。fromJson(str2,HyPayload::class。javaObjectType)valfooterHyFooter(securitypayload。customItems〔creatAt〕)valstr4EncryptUtil。md5(strs〔0〕)EncryptUtil。md5(strs〔1〕)EncryptUtil。sha256(gson。toJson(footer))valnowSystem。currentTimeMillis()valexpiresAtpayload。customItems〔expiresAt〕?。toLong()when{expiresAtnull{无效的token,可能被篡改returnstatusWrong}nowexpiresAt{token失效returnstatusTimeOut}header。app!appheader。author!authorheader。domain!domain{无效的token,可能被篡改returnstatusWrong}str3!str4{无效的token,可能被篡改returnstatusWrong}else{returnstatusOk}}}}获取用户数据fungetPayload(token:String):HyPayload?{varpayload:HyPayload?nullvalstrstoken。split(。)if(strs。size3){valstr2EncryptUtil。de4Base64(strs〔1〕)valgsonGson()payloadgson。fromJson(str2,HyPayload::class。javaObjectType)}returnpayload}获取用户IDfungetUserId(token:String):Int?{varresult:Int?nullvalpayloadgetPayload(token)payload?。let{resultit。customItems〔HyConstant。userId〕?。toInt()}returnresult}}privatedataclassHyHeader(valdomain:String,valauthor:String,valapp:String)dataclassHyPayload(valid:String,valcustomItems:MutableMapString,String)privatedataclassHyFooter(valsecurity:String)这里只是测试代码funmain(){HyAuth。initAuth{this。app123456this。author123456this。security12safe5224asdfe}valtokenHyAuth。createToken(userId01)HyAuth。auth(token){status,payloadwhen(status){HyAuth。statusOk{println(statusOk,用户:{payload?。id})println(token)}HyAuth。statusWrong{println(statusWrong)println(token)}HyAuth。statusTimeOut{println(statusTimeOut)println(token)}}}valuserIdHyAuth。getUserId(token)println(userId)}
再附上一个加密的工具objectEncryptUtil{Base64加密funen4Base64(str:String):String{returnBase64。getEncoder()。encodeToString(str。toByteArray())}Base64解密funde4Base64(str:String):String{returnBase64。getDecoder()。decode(str)。toString(Charsets。UTF8)}AES加密funen4AES(str:String,pwd:String):String{参考java文档Cipher1、创建cipher对象valcipherCipher。getInstance(AES)解密解密的keyvalkeySpecDESKeySpec(pwd。toByteArray())里面指定自己的密码valkfSecretKeyFactory。getInstance(AES)DES的密钥工厂valkey:Key?kf。generateSecret(keySpec)通过密码创建key2初始化,指定加密或者解密模式,keycipher。init(Cipher。ENCRYPTMODE,key)3加密和解密valencryptcipher。doFinal(str。toByteArray())returnBase64。getEncoder()。encodeToString(encrypt)}AES解密funde4AES(str:String,pwd:String):String{参考java文档Cipher1、创建cipher对象valcipherCipher。getInstance(AES)解密解密的keyvalkeySpecDESKeySpec(pwd。toByteArray())里面指定自己的密码valkfSecretKeyFactory。getInstance(AES)AES的密钥工厂valkey:Key?kf。generateSecret(keySpec)通过密码创建key2初始化,指定加密或者解密模式,keycipher。init(Cipher。DECRYPTMODE,key)3加密和解密Base64解码valencryptcipher。doFinal(Base64。getDecoder()。decode(str))returnencrypt。toString(Charsets。UTF8)}des加密funen4DES(str:String,pwd:String):String{参考java文档Cipher1、创建cipher对象valcipherCipher。getInstance(DES)解密解密的keyvalkeySpecDESKeySpec(pwd。toByteArray())里面指定自己的密码valkfSecretKeyFactory。getInstance(DES)DES的密钥工厂valkey:Key?kf。generateSecret(keySpec)通过密码创建key2初始化,指定加密或者解密模式,keycipher。init(Cipher。ENCRYPTMODE,key)3加密和解密valencryptcipher。doFinal(str。toByteArray())returnBase64。getEncoder()。encodeToString(encrypt)}des解密funde4DES(str:String,pwd:String):String{参考java文档Cipher1、创建cipher对象valcipherCipher。getInstance(DES)解密解密的keyvalkeySpecDESKeySpec(pwd。toByteArray())里面指定自己的密码valkfSecretKeyFactory。getInstance(DES)DES的密钥工厂valkey:Key?kf。generateSecret(keySpec)通过密码创建key2初始化,指定加密或者解密模式,keycipher。init(Cipher。DECRYPTMODE,key)3加密和解密Base64解码valencryptcipher。doFinal(Base64。getDecoder()。decode(str))returnencrypt。toString(Charsets。UTF8)}md5加密funmd5(input:String):String{valinstanceMessageDigest。getInstance(MD5)returntoHex(instance,input)}sh256加密funsha256(input:String):String{valinstanceMessageDigest。getInstance(SHA256)returntoHex(instance,input)}privatefuntoHex(instance:MessageDigest,input:String):String{valresultinstance。digest(input。toByteArray())valstringBuilderStringBuilder()转成16进制result。forEach{valvalueit移位操作valhexvalue。toInt()and(0xFF)valhexStrInteger。toHexString(hex)如果是一位,则前面加0if(hexStr。length1){stringBuilder。append(0)。append(hexStr)}else{stringBuilder。append(hexStr)}}returnstringBuilder。toString()}}
啰嗦几句:token是不需要保存在服务器端的,服务器端只负责生成、校验和读取token里保存的数据,比如userId。想在服务端保存token?如果在服务端保存了,那它和使用session有什么区别?
新能源汽车可以用家里的电充电吗新能源汽车可以用家里的电充电,对于绝大多数新能源汽车而言,在充电的时候,是可以在车内用电的。只是此时如果使用空调等大功率电器,将会使充电功率下降,从而使充电时间延长,影响其他车……
比亚迪股份(01211。HK)3月新能源汽车销量达10。5万格隆汇4月3日丨比亚迪股份(01211。HK)披露2022年3月产销快报,当月销量合计104,878辆,同比增长156。95;本年累计销量为291,378辆,同比增长179。7……
除夕夜作文1200字4篇无论是身处学校还是步入社会,许多人都写过作文吧,作文是经过人的思想考虑和语言组织,通过文字来表达一个主题意义的记叙方法。还是对作文一筹莫展吗?下面是小编帮大家整理的除夕夜作文1……
棒棒作文600字之所以称他为棒棒,是因为棒棒尤爱吃棒棒糖。棒棒经常会叼一根棒棒糖在嘴里,自习、课间,甚至去洗手间,棒棒糖几乎成了棒棒生活的一部分。某天早晨,把手习惯性地往抽屉里伸,又抓出……
美丽的你痴迷的我作文1000字清明时节,小雨纷纷。在这恬淡美丽、乍暖还寒的春日时节,我与父母来到美丽的西樵山踏青。西樵山,你的美丽,让我痴迷。在追寻你的路上,我们一家开着车,一路欣赏着你的美丽。头微微……
二三零很多时候,我希望人生的后八年只是我十岁时做的一场梦。江淮地区的冬天,雪并不是常客。前几天天气预报说安徽要下暴雪,结果地温太高,半个下午大雪纷飞之后也没有积雪。我拉开窗帘,额头抵……
迷糊的爸爸作文400字爸爸最爱的人,是我们一家人。爸爸最爱的。东西,就是计算机。只要坐在计算机前,爸爸就赖着不起来了。尤其是有关军事的计算机游戏,那是他的最爱,一玩就停不下来了。有时候,……
关于大扫除的作文100字1关于大扫除的作文下午课后,我们在教室里大扫除,有的洗窗台,有的擦黑板,有的洒水,有的扫地,我抹桌子。大扫除结束了,大家看到窗子明明亮亮,地面干干净净,桌椅摆得平平……
端午节呵呵端午节快到了!空气中飘着清甜的粽香,清香让我想起粽子的味道,好想再尝尝,不过还有4天。时间在走快些,让我早点来到星期一。在这天人们有很多活动,有包粽子,划龙舟h……
寒假见闻寒假联欢会的一天寒假的一天晚上,我和爸爸妈妈在家里开起了联欢晚会。爸爸妈妈作为主持人讲了几句开场白,接着妈妈又说:下面有请李欣的爸爸表演舞蹈‘太空行走’,大家掌声欢迎。只见爸爸站在舞台(……
在海洋里闯荡的瓶子作文小女孩没有收到回信,心急地拿着精心装扮的瓶子里面装着一封彩色的信。她大力地向大海丢去,这是一个有礼貌的瓶子。瓶子跳进了海洋。它想,哇,这是我看过最美的蓝。蓝得那么透明那么……
外科医生需要什么样的智能手术机器人?医生专栏随着智能化和机械化时代的到来,机器人在医疗领域也有着越来越多的应用场景,比如机器人辅助影像学阅片,比如机器人辅助瘫痪患者康复锻炼,比如机器人代替护士为患者发送药物等等。其中在外……
数字货币的战略任务数字货币,近期频繁的看到这个方向的消息,它会对你我的生活产生什么样的影响,相信很多人都没有一个概念。那下面我们就聊聊几个猜想首先,数字货币是一种流通的电子货币,存在于互联……
联想让人联想的太多了最近一直有人在说联想的是是非非,相信总会有真相出来的,但是我们没有站队的必要,产品我们可以用,话他可以说。中国有句古话,身正不怕影子斜,真的没有问题,可以公开回应相关事件……
小学生开学第一天的作文三篇新学期开学啦,既激动又期待还紧张。你还记得自己当初新学期开学的印象吗?下面是小编为大家整理的小学生开学第一天作文,仅供参考,欢迎阅读。小学生开学第一天作文1时间像飞箭,一……
卖掉华为P50pro后,入手了iPhone13pro,使用半最近换了13pro,感觉就是一言难尽。此前的主力机是华为P50Pro,首发买的,用了一段时间体验一般,iphone13的加量不加价让我心动了,于是把华为P50pro拿去卖了50……
中秋趣事的作文3篇中秋趣事作文(一)时间过的真快啊,转眼间又到了一年一度的中秋佳节了。晚上我和爷爷奶奶爸爸妈妈一起一边吃着月饼一边欣赏着又圆又亮的明月。啊!今晚的月饼好丰盛啊:有哈密……
中秋吃月饼的作文范文中秋吃月饼的作文范文1月中清露点朝夜。玉盘似的圆月在云中穿行,朦朦胧胧的月光洒向大地。月圆之夜,团圆之节,美丽的满月为中秋点缀。我很喜欢中秋节,喜欢中秋那一天独特而迷人的……
我的朋友孔凌辉作文范文能同甘,不能共苦,不是朋友;能共苦,不能同甘,也不是朋友。把一粒米掰成两半分享的,肯定是朋友;把一杯酒倒成两杯分喝的,不一定是朋友;忠言逆耳,悬鞭于鞍后的那个人,不一定不是你的……
义卖小学生作文义卖小学生作文1叔叔!阿姨!走过路过不要错过!这里有好看的书!好玩的玩具!各种各样的小玩意儿!还有漂亮的水杯小蔡叔叔的爱心小铺里,姐姐们为了招揽生意,放开嗓子大声地喊了起……
初中生节日文化作文之春节的习俗小年,即每年农历腊月23或24,它是庆祝整个春节活动的开始和伏笔,主要活动有两项:扫年和祭灶。扫年,即扫尘,实际上就是搞家庭环境卫生。北方人以腊月23为小年,称扫房;南方人以腊……
关于太阳雨的日记300字走在上学的路上,太阳火辣辣的照射着大地。天空很蓝很蓝,白云朵朵。真是秋高气爽,天高云淡呀!多美好的季节呀!树木葱葱郁郁,随着秋风自由摇动,好像也都陶醉在这美丽的秋的旋律里……
我的新同学人物作文随着时间的流逝,不知经过了多少个日日夜夜,光阴似箭。转眼间,我马上便要踏入这初中的大门。里面,一定充满了期待与欢乐,我也将重新创造新的回忆。而我,在这人海茫茫中,交到了我的新同……
景德镇游记为题目的作文位于山气夕佳的江西东北部的景德镇似乎得天独厚般赋予它秀美纯净的性情,以至于成了发明了精美绝伦的瓷器成了享誉中外的中国瓷都景德镇。作为一个江西九江人,我对这个小镇从小就有种……