卡号前 12 位应为安全输入,其余 4 位正常

Posted

技术标签:

【中文标题】卡号前 12 位应为安全输入,其余 4 位正常【英文标题】:Card number first 12 digits should be secure entry and remaining 4 digits as normal 【发布时间】:2012-11-06 04:18:53 【问题描述】:

卡号前 12 位数字应为安全输入,其余 4 位数字正常,例如我正在输入卡号 - 4111 1111 1111 1111。在文本字段中输入此文本时,前 12 位数字应为安全输入,后 4 位数字应为安全输入作为正常输入,即 1111。(最后卡号将看起来像 XXXXXXXXXXXX1111)。

谁能告诉我怎么做。

【问题讨论】:

你的问题解决了吗,我有一个很好的逻辑? 我已经解决了..但是发布你的逻辑..帮助一些人。 【参考方案1】:

一种选择是实现UITextField 委托方法textField:shouldChangeCharactersInRange:replacementString:。在这种方法中,您希望始终返回 NO。但首先您将更新文本字段的文本,使前 12 位数字显示 X。您将在另一个 ivar 中跟踪实际文本。

编辑:这应该工作:

- (NSString *)maskNumber:(NSString *)num 
    static NSString *twelveX = @"XXXXXXXXXXXX";

    if (num.length < twelveX.length) 
        return [twelveX substringToIndex:num.length];
     else 
        return [twelveX stringByAppendingString:[num substringFromIndex:twelveX.length]];
    


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    // Determine where the cursor should be
    UITextRange *selRange = textField.selectedTextRange;
    NSInteger cursorPos = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selRange.start] + string.length;

    _cardNum = [_cardNum stringByReplacingCharactersInRange:range withString:string];

    textField.text = [self maskNumber:_cardNum];

    // Reset the cursor position
    UITextPosition *startPos = [textField positionFromPosition:textField.beginningOfDocument offset:cursorPos];
    selRange = [textField textRangeFromPosition:startPos toPosition:startPos];
    textField.selectedTextRange = selRange;

    return NO;

其中_cardNumNSString 类型的ivar。这会跟踪实际的卡号。

【讨论】:

我能在 swift 4 @rmaddy 中得到这个答案吗【参考方案2】:

我建议您保留两个字段,第一个是一个 12 个字符的有限密码字段,用于保护文本。

使用以下委托方法限制字段的长度:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 12) ? NO : YES;

设置字段以强制安全文本输入:

twelveDigitTextField.secureTextEntry = YES;

第二个字段,您限制为四个字符,与用于 12 个字符字段的方法相同。您无需使用 secureTextEntry 属性保护此字段。

如果你想让这个界面“漂亮”,请使用相同的委托方法跟踪第一个字段的长度,并将第二个字段设置为下一个响应者——换句话说,光标将跳转到四个字符的字段一旦十二个字符的字段填满:

/* called within delegate method for 12-character field, once filled up */
[fourDigitTextField becomeFirstResponder]; 

您可能希望这样做的一个原因是,为敏感数据(如 12 位卡号)获得与密码相同的操作系统级保护,输入密码样式 UITextField

虽然您可以将文本替换为键入的文本,但可能更容易忽略允许将此未受保护字段中的敏感数字复制并粘贴到另一个应用程序 - 而对于密码字段,这些限制通常在默认情况下存在.

【讨论】:

以上是关于卡号前 12 位应为安全输入,其余 4 位正常的主要内容,如果未能解决你的问题,请参考以下文章

常见开发场景安全开发指南

excel表格内输入19位银行卡号,为啥后四位总是变成0?

vue手机号按344分隔,银行卡号每4位空格分隔

txt格式转换为csv格式后,银行卡卡号最后四位默认为0咋个转换为正常文本!

银行卡号每隔4位插入空格 (再用户填写银行卡号的时候挺有用的) IE9+

如何在.net中屏蔽信用卡号的前6位和后4位