MATLAB читать в пароле

Я создаю приложение MATLAB, которое аутентифицирует учетные данные пользователя. Я хочу прочитать его пароль и как-то скрыть его введенные учетные данные.

Некоторые ограничения:

  • Я должен учитывать Windows, а также пользователи Linux/ Mac.
  • Я не могу быть уверен ни в каких программах (perl/python/VBS) в пользовательской системе.

Вот что я попробовал:

Руководство по прямой

Работает, но не вариант, так как пользователь, вероятно, будет запускать Matlab в -nodesktop (или же -nodisplay) Режим.

MATLAB + Java

console.readPassword. Это ужасно портит мой терминал.

системные вызовы

По сути, я называю скрипты bash или dos для ОС.

У меня есть следующий вызов для Linux/ Mac:

[status cred] = system('stty -echo; read cred; stty echo;echo ""; echo "$cred"');

Предполагается, что он соберет учетные данные пользователя и отправит их в "cred". Я проверил, что он работает в обычном терминале, но выполнение его в MATLAB не приводит к выводу ничего, и требуется Ctrl-C, чтобы вернуть >> незамедлительный.

MATLAB Perl

Windows MATLAB упаковывает Perl, как указано в комментариях. Я попробовал следующий фрагмент:

use Term::ReadKey;
use Term::ReadLine;
ReadMode('noecho');
$yesnoline = Term::ReadLine->new("foo");
$pass = $yesnoline->readline();
printf "$pass";
ReadMode('restore');

А потом назвал это [result status] = perl('my_perl.pl'), Отлично работает на Linux. В Windows:

res =

Ошибка GetConsoleMode, LastError=|6| в строке ReadKey.pm 264.

sta =

 9

Мои поиски до сих пор показывают, что это проблема, связанная с упакованной версией Perl для Windows.

Есть идеи, что происходит в вышеупомянутых подходах?

2 ответа

Решение

Я предлагаю вам обнаружить установку Windows (ispc), и обрабатывать их иначе, чем в Unix-подобных системах, создавая графический интерфейс MATLAB или что-то подобное.

Вот одно из возможных решений для Windows, использующее .NET Windows Forms из MATLAB:

function pass = getPasswordNET()
    %# password return value
    pass = '';

    %# hidden figure used to wait for button press
    fig = figure('Visible','off', ...
        'IntegerHandle','off', 'HandleVisibility','off');

    %# create and show the Windows Forms GUI
    [handles,lh] = InitializeComponents();
    handles.frm.Show();

    %# block execution until figure is closed
    waitfor(fig)

    %# remove the listeners
    delete(lh);

    return;

    %# create GUI
    function [handles,lh] = InitializeComponents()
        %# import assembly
        NET.addAssembly('System.Windows.Forms');

        %# form
        frm = System.Windows.Forms.Form();
        frm.SuspendLayout();

        %# textbox
        tb = System.Windows.Forms.TextBox();
        tb.Dock = System.Windows.Forms.DockStyle.Fill;
        tb.Text = '';
        tb.PasswordChar = '*';
        tb.MaxLength = 14;

        %# button
        bt = System.Windows.Forms.Button();
        bt.Dock = System.Windows.Forms.DockStyle.Bottom;
        bt.Text = 'Submit';

        %# setup the form
        frm.Text = 'Password';
        frm.ClientSize = System.Drawing.Size(250, 40);
        frm.Controls.Add(tb);
        frm.Controls.Add(bt);
        frm.ResumeLayout(false);
        frm.PerformLayout();

        %# add event listeners
        lh(1) = addlistener(bt, 'Click', @onClick);
        lh(2) = addlistener(frm, 'FormClosing', @onClose);

        %# return handles structure
        handles = struct('frm',frm, 'tb',tb, 'bt',bt);
    end

    %# event handlers
    function onClick(~,~)
        %# get password from textbox
        pass = char(handles.tb.Text);

        %# close form
        handles.frm.Close();
    end
    function onClose(~,~)
        %# delete hidden figure (to unblock and return from function)
        close(fig)
    end
end

Я протестировал вышеупомянутое на своей машине, и оно работало, даже когда MATLAB запускался в режиме без головы:

matlab.exe -nodesktop -noFigureWindows

затем назвал это как:

>> pass = getPasswordNET()
pass =
secret_password

Скриншот

Это должно быть просто сделать что-то подобное в Java, используя JPasswordField Swing

Java getPassword

Мне пока не удалось заставить подход getPassword вернуть консоль в нормальное состояние - я предполагаю, что ваш код выглядит примерно так:

import java.lang.*
cs = System.console()
a = cs.readPassword()

Не могли бы вы подтвердить это?

Решение Python

Если решение должно быть многоплатформенным, и вы не возражаете против зависимости Python, я бы предложил написать очень простой сценарий Python и использовать его с системным вызовом Matlab, что-то вроде

файл: usergetpass.py

import getpass
import os
os.sys.stdout.write(getpass.getpass())

тогда в матлаб

[status,pass] = system('python usergetpass.py');

Затем вам придется (тривиально) разобрать pass Тем не менее, фактический пароль содержится в строке 3 pass,

Таким образом, вы можете поместить вышеупомянутое в вашу собственную функцию мини-Matlab,

function out = getpass()
[status, pass] = system('python usergetpass.py');
out = pass(13:end-1);

Примечание: я могу использовать это, потому что пароль всегда появляется в этой точке в переменной pass.

Другие вопросы по тегам