IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Information Management  >

如何部署 SB+ 密码验证

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 中级

Ehab AbuShmais (ehaba@us.ibm.com), 高级技术服务工程师, IBM 

2006 年 2 月 16 日

IT 安全对于商业成功是个极其重要的要素。密码猜测是系统所遇到的最常见的攻击方式之一。因而,必须控制、管理和监控您的应用程序的密码限制策略。本文为您逐步讲解为了 SystemBuilder ™安全而部署密码验证的方法。

下述文章将会利用所有有效的、却没有出现在 SB+ 参考手册上或 SB+ 管理手册上的 SB+ 安全验证例程和标志。您可以使用这里提供的示例程序一步步地部署一个完整的密码控制解决方案。

第一步:将以下 2 项添加到 DMSECURITY 文件中:

1. VALIDATE.LOG

  • 在此项的第一个属性中,指定每次登录尝试时最多允许重试的次数。如果这个字段为空,SB+ 将会继续默认为 3次。
  • 在此项的第二个属性中,指定每当输入一个不正确的密码时将要调用的用户子例程的名称。一旦在 SB+ 登录提示符处输入一个不正确的密码,这个用户子例程都会被调用。为了使用下面提供的示例子例程,此处输入 USER.LOG 作为子例程的名称。
    该子例程有两个参数:UserIDAttempt #
  • 为了使该变更生效,将(DMCONT) SB.CONTROL 控制标志设置为 1。 如果没有设置该标志,则用户子例程将不会被调用。

注意:密码重试的次数限制广泛应用于系统范围 —— 类似于用户和组安全、登录和键盘超时的处理当中都会用到它。用户子例程需要声明两个参数(正如在 SUBROUTINE USER.LOG(UID, ATTEMPT) 中一样)。用户子例程必须在 VOC 中有一个输入项(编目指针)。

2. VALIDATE.USER

  • 在此项的第一个属性中,指定将要调用的用户子例程的名称。当在 SB+ 登录提示符处输入正确的密码后,该用户子例程将会被调用。要使用下面提供的示例子例程,此处输入 USER.CHECK 作为子例程名称。
    该子例程有两个参数:UserIDErr。Err 标志有四个返回值:
    • ERR = 0:成功,没有错误。
    • ERR = 1:错误,重试。
    • ERR = 2:错误,严重错误,注销用户。
    • ERR = 3:错误,重试但是要刷新屏幕。

注意:用户子例程需要声明两个参数(正如 SUBROUTINE ADDITIONAL.USER.CHECK(UID, ERRNO) 中一样),并且必须在 VOC 中有一个输入项(编目针)。

第二步:在 BP(Basic 程序)文件或者您自己选择的文件中创建以下子例程:


清单 1. CHECK.PASS 的代码
                
SUBROUTINE CHECK.PASS(NEWPASS,VALID.FLAG)
*
   $INCLUDE DMSKELCODE COMMON
   $INCLUDE DMSKELCODE STANDARD.EQU
*
* Validate password is more than 6 characters and less than 50
*
L = LEN(NEWPASS)
  IF L < 6 OR L > 50 THEN 
    CRT; CRT; CRT "PASSWORD MUST BE MORE THAN 6 CHARACTERS AND LESS THAN 50"
    VALID.FLAG = 1
    RETURN
  END ELSE VALID.FLAG = 0
*
* Validate that password is a mix of numbers + upper case + lower
* case + spcial charcters
*
C = 0; CNT1 = 0; CNT2 = 0; CNT3 = 0; CNT4 = 0
LOOP WHILE C # L DO
  C = C + 1
  CH = NEWPASS[C,1]
  IF CH = "" THEN
    RTN.FLAG = '0'; RETURN
  END
  IF (SEQ(CH)  >= 65) AND (SEQ(CH) <= 90) THEN CNT1 = 1; *CRT "UPPER CASE"
  IF (SEQ(CH)  >= 97) AND (SEQ(CH) <= 122) THEN CNT2 = 1; *CRT "LOWER CASE"
  IF (SEQ(CH)  >= 48) AND (SEQ(CH) <= 57) THEN CNT3 = 1; *CRT "NUMBER"
  IF (SEQ(CH)  >= 33) AND (SEQ(CH) <= 47) THEN CNT4 = 1; *CRT "SPECIAL CHAR 1"
IF (SEQ(CH) >= 58) AND (SEQ(CH) <= 64)  THEN CNT4 = 1; *CRT "SPECIAL CHAR 2"
IF (SEQ(CH) >= 91) AND (SEQ(CH) <= 96)  THEN CNT4 = 1; *CRT "SPECIAL CHAR 3"
IF (SEQ(CH)  >= 123) AND (SEQ(CH) <= 126) THEN CNT4 = 1; *CRT "SPECIAL CHAR 4"
  * Add all flags to make sure all requirment are met
  IF CNT1 + CNT2 + CNT3 + CNT4 = 4 THEN VALID.FLAG = 0
REPEAT
  IF CNT1 + CNT2 + CNT3 + CNT4 # 4 THEN
    VALID.FLAG = 1
    CRT; CRT; CRT "MUST USE MIX CASE AND USE NUMBER AND SPECIAL CHARACTERS"
  END
RETURN

如果您使用以下两个例程,连续三次不正确的认证尝试将会使该用户 ID 无效,直到某个管理员重新设置了尝试的次数(使用类似于清单 4 中的那段处理示例)。请根据您的个人偏爱随意编辑和定制这些代码。


清单 2. USER.LOG 的代码
                
SUBROUTINE USER.LOG(UID,ATTEMPT)
*
$INCLUDE DMSKELCODE COMMON
$INCLUDE DMSKELCODE STANDARD.EQU
*
OPEN "DMSECURITY" TO SEC ELSE CRT "CAN NOT OPEN DMSECURITY"
READ USER.REC FROM SEC,'~':UID else CRT "CAN NOT READ USER ID"
*
USER.REC<41> = USER.REC<41>+ 1
WRITE USER.REC ON SEC,'~':UID
RETURN


清单 3. USER.CHECK 的代码
                
SUBROUTINE USER.CHECK(UID,ERRNO)
*
$INCLUDE DMSKELCODE COMMON
$INCLUDE DMSKELCODE STANDARD.EQU
*
 OPEN "DMSECURITY" TO SEC ELSE CRT "CAN NOT OPEN DMSECURITY FILE"
 READ USER.REC FROM  SEC,'~':UID ELSE CRT "CAN NOT READ USER ID"
*
 IF USER.REC<41> >= 3 THEN
  ERRNO = 2
* Prevent user from logging in because they had 3 wrong password attempts
  CRT; CRT "CONTACT YOUR SYSTEM ADMINISTRATOR"
END ELSE
* Reset the retries counter for nex time
  USER.REC<41> = 0 
  WRITE USER.REC ON SEC,'~':UID
  ERRNO = 0
END
RETURN

重新设置认证尝试次数的处理程序段:


清单 4. RESET.PWD 的代码
                
LOCAL USER.REC, UID                                            
USER.REC = ''                                                  
UID = '~':@PARAM                                               
IF @PARAM = '' THEN                                            
 DISP 3, "Must provide a , then USERID after the process name" 
 EXIT X                                                        
ELSE                                                           
 @RTN.FLAG = 0                                                 
END                                                            
*                                                              
READ USER.REC FROM "DMSECURITY",UID                            
IF @RTN.FLAG THEN                                              
 DISP 3, @PARAM:" Does not exist!"                             
ELSE                                                           
 USER.REC<41> = 0                                              
 WRITE USER.REC ON "DMSECURITY",UID                            
END                                                            
@PARAM = ''

注意:若登录之后要更改密码,请执行下面的过程:

CHANGE.PWD

第三步:将 DMSECURITY 中的 PASSWORD.VALIDATION 编辑成下面这样:

*CHECK.PASS
(instead of **BYPASS)

注意:**BYPASS 是默认设置,意味着将不会执行任何密码验证。如果您在指定子例程名称时,在名称前不用星号(*),则该子例程将会负责密码验证。

如果您仅仅使用一个星号(*)而没有子例程名称,那么 SB+ 密码验证将会执行下面列出的验证。*CHECK.PASS 中开始的一个单独的星号表示将会使用 SB+ 密码验证,而不会允许:

  • 由 3 个或更多的连续的字母或数字构成的密码,例如 ABC 或 123(错误消息:PASSWORD MUST NOT CONTAIN SEQUENCES)。
  • 包含 3 个或更多重复字符的密码,例如在一行里 3 次使用同一个字母,例如 AAA(错误消息:PASSWORD CONTAINS CHARACTERS THAT ARE TOO REPETITIVE)。
  • 包含逗号的密码(错误消息:PASSWORD CONTAINS AN ILLEGAL CHARACTER)。
  • 密码是这个帐户所使用的最后 10 个密码之一(错误消息:YOU CANNOT REUSE AN OLD PASSWORD)。
    注意:旧密码(以加密的形式)保存在 DMSECURITY 文件的用户记录字段 <11> 中。清除这个字段可以使您又一次使用旧密码。不过请注意,那样做将会使记录的校验和无效。通过按 F2 键,确保进入用户安全设置(User Security Setup)屏幕,并且重新将用户记录保存成文件形式。如果您仅仅只是偶尔需要使用旧密码,使用这种方法还是可以的。
  • 只包含数字的密码(错误消息:PASSWORD MUST NOT BE NUMERIC)。
  • 无密码(错误消息:INVALID PASSWORD)。
  • 与用户 ID 号相同的密码(错误消息:PASSWORD MUST NOT BE PART OF YOUR NAME OR ID CODE)。
  • 少于 4 个字符或者超过 50 个字符的密码(错误消息:PASSWORD MUST BE AT LEAST 4 CHARACTERS IN LENGTH BUT LESS THAN 50 CHARACTERS)。

注意:

  • 如果您使用 CHECK.PASS 示例子例程,错误消息 5 至 8 就不会出现,因为 CHECK.PASS 中的验证要求密码长度超过 6 个字符。
  • 为了防止用户使用某些指定的密码,就要将这些密码添加到文件 DMSECURITY 中名为 PASSWORD 的条目中的无效密码清单里。
  • 所有不成功的登录尝试都被写入日志。您可以在 SB+ 管理员帐户下,通过使用安全菜单中的 SB+ 安全报告来检查这个日志。
  • 为了迫使用户每隔 30 天或者在任何您需要的期限内修改他们的密码,可以将这个期限添加到 Pwd Rollover Date 下的用户安全设置中。若要为组成员完成这个设置,则可以进入组安全设置,然后按 F7 - Logon Times。


参考资料

学习

获得产品和技术

讨论


关于作者

作者照片

Ehab AbuShmais 是一名 SB+ 软件工程师,他有 11 年在 IBM 从事 SB+ 产品支持、工程和咨询工作的经验。Ehab 还撰写了一本书:Building Applications Using IBM SB+ GUI。他拥有州立南方理工大学的信息系统工程理学硕士学位以及丹佛 大学的计算机信息系统理学博士学位。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


UniVerse 是 IBM 在美国的注册商标。 UniData 是 IBM 在美国的注册商标。 SystemBuilder 是 IBM 在美国的商标。 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款