簡體   English   中英

如何在命令行應用程序中創建安全密碼輸入字段?

[英]How to make a secure password input field in a command line app?

我正在為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執行相同的操作?

只是為了完整起見: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)
}
inputString = String(validatingUTF8: UnsafePointer<CChar>(getpass("Please enter your password: ")))

這是你如何使用swift獲得輸入

使用C函數getpass(3) 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM