【问题标题】:How to make a secure password input field in a command line app?如何在命令行应用程序中创建安全的密码输入字段?
【发布时间】:2015-02-19 00:15:39
【问题描述】:

我正在用 Swift 为 OS X 编写一个命令行应用程序。我需要提示输入用户名和密码(不是计算机上的用户帐户,也不是保存在钥匙串中的凭据)。我可以提示输入用户名就好了:

func getInput() -> String {
    var keyboard = NSFileHandle.fileHandleWithStandardInput()
    var inputData = keyboard.availableData
    return NSString(data: inputData, encoding:NSUTF8StringEncoding)!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
}

let username = getInput()

我也想提示输入密码,但它会在用户键入密码时在控制台中打印密码。如何在不回显到控制台的情况下接受来自 STDIN 的输入?

请注意,我需要应用程序是交互式的,用户永远不会将用户名和密码作为命令行参数传递,因此 argv 不是正确答案。

例如,在 Ruby 中执行此操作时,您将输入:

require 'io/console'
puts "Enter your password"
@password = STDIN.noecho(&:gets).chomp

然后它会在屏幕上显示为这个图像:

无论输入多少个字母,它都只显示带有点的蓝色框。它不会将密码打印到屏幕上,也不会显示 ********* 作为密码。

是否可以在命令行 OS X 应用程序中使用 Swift 或 Objective-C 做同样的事情?

【问题讨论】:

    标签: objective-c macos swift


    【解决方案1】:

    为了完整起见:getpass() 非常适用于密码,但不幸的是,这个函数也有一个限制,它最多只能读取 128 个字符。如果您想提示输入非常长的密码或私钥,请改用 BSD 的 readpassphrase()。

    Swift 2.0 示例:

    var buf = [Int8](count: 8192, repeatedValue: 0)
    let passphrase = readpassphrase("Enter passphrase: ", &buf, buf.count, 0)
    if let passphraseStr = String.fromCString(passphrase) {
        print(passphraseStr)
    }
    

    Swift 3.1 及更高版本:

    var buf = [CChar](repeating: 0, count: 8192)
    if let passphrase = readpassphrase("Enter passphrase: ", &buf, buf.count, 0),
        let passphraseStr = String(validatingUTF8: passphrase) {
    
        print(passphraseStr)
    }
    

    【讨论】:

    • 真的没有更现代的方法了吗?即使用 Swift 包管理器目标实用程序(它本身是一个 SPM 包)或类似的?
    【解决方案2】:
    inputString = String(validatingUTF8: UnsafePointer<CChar>(getpass("Please enter your password: ")))
    

    这就是使用 swift 获取输入的方式

    【讨论】:

      【解决方案3】:

      使用 C 函数 getpass(3)。例如:

      char *p = getpass("Please enter your password: ");
      NSString *password = [NSString stringWithUTF8String:p];
      NSLog(@"%@", password);
      

      【讨论】:

        猜你喜欢
        • 2011-05-03
        • 2012-03-08
        • 2011-01-25
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        相关资源
        最近更新 更多