[英]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.