当前位置: 首页 > news >正文

Lua实战之密码验证

验证标准:

密码必须包含 数字、字母(不区分大小写)和特殊字符,长度为8-16位!

function checkPwd(pwd)
	if #pwd == 0 then
		print("密码不能为空")
		return false
	end
	if #pwd < 8 or #pwd > 16 then
		print("密码长度为8-16位")
		return false
	end
	local numberCnt, letterCnt, specialCnt, otherCnt = 0, 0, 0, 0
	for s in string.gmatch(pwd, ".") do
		-- print(s)
        local ASCIICode = string.byte(s)
        if ASCIICode >= 48 and ASCIICode <= 57 then
        	numberCnt = numberCnt + 1
        elseif (ASCIICode >= 65 and ASCIICode <= 90) or 
        	   (ASCIICode >= 97 and ASCIICode <= 122) then
        	letterCnt = letterCnt + 1
        elseif (ASCIICode >= 33 and ASCIICode <= 47) or 
        	   (ASCIICode >= 58 and ASCIICode <= 64) or 
        	   ASCIICode == 91 or 
        	   (ASCIICode >= 93 and ASCIICode <= 96) or 
        	   (ASCIICode >= 123 and ASCIICode <= 126) then
        	-- 转义字符(\ 92)要从特殊字符中剔除
        	specialCnt = specialCnt + 1
        else
        	otherCnt = otherCnt + 1
        end
    end
    if otherCnt > 0 then
    	print("密码含有非法字符")
    	return false
    elseif numberCnt == 0 then
    	print("密码必须包含数字")
    	return false
    elseif letterCnt == 0 then
    	print("密码必须包含字母")
    	return false
    elseif specialCnt == 0 then
    	print("密码必须包含特殊字符")
    	return false
    end
    print("密码格式正确")
    return true
end
local pwdStr = ""
checkPwd(pwdStr)  -- 密码不能为空
pwdStr = "abc"
checkPwd(pwdStr)  -- 密码长度为8-16位
pwdStr = "12345678901234567"
checkPwd(pwdStr)  -- 密码长度为8-16位
pwdStr = "12345678中文"
checkPwd(pwdStr)  -- 密码含有非法字符
pwdStr = "1234\ndabcd"
checkPwd(pwdStr)  -- 密码含有非法字符
pwdStr = "abcdefgh"
checkPwd(pwdStr)  -- 密码必须包含数字
pwdStr = "12345678"
checkPwd(pwdStr)  -- 密码必须包含字母
pwdStr = "1234abcd"
checkPwd(pwdStr)  -- 密码必须包含特殊字符
pwdStr = "1234abcd!@#"
checkPwd(pwdStr)  -- 密码格式正确

ps

关于特殊字符的支持可以参考:

在 Linux 系统上的密码中支持的特殊字符:
波浪线  ~
at符号  @
散列标记  #
下划线  _
插入标记  ^
星号  *
百分号  %
斜杠  /
句点  .
加号  +
冒号  :
分号  ;
等号  =

在 Windows 系统上的密码中支持的特殊字符:
波浪线  ~
at符号  @
下划线  _
斜杠  /
加号  +
冒号  :

相关文章:

  • 玩转“网上邻居”之网络配置(一)
  • 标准整数类型的取值范围
  • 玩转“网上邻居”之网络配置(二)
  • VS Code 更改快捷键
  • 双喜临门
  • 位运算
  • pip 不是内部或外部命令
  • 一个大专生的理财观
  • Unity 本地数据持久化之 PlayerPrefs
  • 给投资入门者的几点建议
  • Lua实战之布尔值(boolean)排序
  • 生命的厚味
  • Lua 使用 os.time 获取时间戳需谨慎
  • 用BAT和VBS搜集AD中的客户PC资料
  • Lua string.format() 使用整理
  • gitlab-ci配置详解(一)
  • HTML-表单
  • SegmentFault 2015 Top Rank
  • 推荐一个React的管理后台框架
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (done) 两个矩阵 “相似” 是什么意思?
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (利用IDEA+Maven)定制属于自己的jar包
  • (小白学Java)Java简介和基本配置
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .apk 成为历史!
  • .cfg\.dat\.mak(持续补充)
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net FrameWork简介,数组,枚举
  • .NET MVC 验证码
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET中的Exception处理(C#)
  • .pop ----remove 删除
  • @EnableWebMvc介绍和使用详细demo
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [C++]STL之map
  • [Excel] vlookup函数
  • [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态
  • [FROM COM张]如何解决Nios II SBTE中出现的undefined reference to `xxx'警告
  • [idea]关于idea开发乱码的配置
  • [JavaEE系列] Thread类的基本用法
  • [Neural Network] {Université de Sherbrooke} L2.9 Param Initialization
  • [OIDC in Action] 3. 基于OIDC(OpenID Connect)的SSO(添加Github OAuth 2.0的支持)