Вопрос безопасности ввода паролей всегда актуален, особенно в условиях, когда ввод осуществляется в присутствии посторонних. Разработчики, использующие компоненты Delphi, часто сталкиваются с необходимостью обеспечения конфиденциальности вводимых данных, в том числе и при использовании сенсорной клавиатуры Vcl.Touch.Keyboard.TTouchKeyboard.
Проблема заключается в том, что стандартная реализация TTouchKeyboard не предоставляет возможности скрыть отображение нажатых клавиш, что делает процесс ввода пароля незащищенным. В условиях, когда вокруг рабочего места расположены несколько мониторов, отображающих один и тот же экран, эта проблема становится особенно актуальной.
Подходы к решению проблемы
Один из способов решения проблемы — отключение других мониторов во время ввода пароля. Однако, если отображение на дополнительных мониторах осуществляется на уровне аппаратного обеспечения, такой подход не будет эффективен.
Другой вариант — разработка собственной клавиатуры с возможностью контроля за поведением кнопок. Это позволит полностью управлять процессом ввода, но потребует значительных усилий и времени.
Подтвержденное решение
Существует решение, которое позволяет улучшить безопасность ввода пароля, не изменяя исходный код компонента TTouchKeyboard. Можно создать свой класс кнопки, наследуясь от TKeyboardButton и переопределив метод Paint, чтобы исключить отображение подсветки нажатой клавиши.
type
TMyKeyboardButton = class(TKeyboardButton)
public
procedure Paint(Canvas: TCustomCanvas = nil); override;
end;
procedure TMyKeyboardButton.Paint(Canvas: TCustomCanvas);
begin
if State <> TDrawState.dsPressed then
inherited;
end;
Для использования этого класса необходимо установить его в качестве DefaultButtonClass для TTouchKeyboard:
Возможно, потребуется изменить свойство Layout компонента клавиатуры, чтобы запустить перестройку кнопок.
Пример кода
unit Unit1;
interface
uses
Winapi.Windows, Vcl.Graphics, Vcl.ExtCtrls, Vcl.Touch, System.SysUtils, System.Variants, System.Classes, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls;
// ... другие компоненты формы ...
type
TForm1 = class(TForm)
TouchKeyboard1: TTouchKeyboard;
procedure FormCreate(Sender: TObject);
private
{ Добавить определения пользовательских переменных }
public
{ Добавить пользовательский код }
end;
type
TMyKeyboardButton = class(TKeyboardButton)
private
function GetButtonState: TDrawState; override;
public
procedure Paint(Canvas: TCustomCanvas); override;
end;
{ TForm1 }
implementation
{$R *.dfm}
// Процедура переопределения отображения состояния кнопки
function TMyKeyboardButton.GetButtonState: TDrawState;
begin
Result := inherited GetButtonState and not dsPressed;
end;
procedure TMyKeyboardButton.Paint(Canvas: TCustomCanvas);
begin
if GetButtonState <> dsSelected then
inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TouchKeyboard1.DefaultButtonClass := TMyKeyboardButton;
end;
end.
Используя данное решение, можно сохранить функциональность стандартной клавиатуры TTouchKeyboard, одновременно убрав подсветку нажатых клавиш, что повысит уровень безопасности ввода паролей.
Вывод:
Разработчикам, сталкивающимся с проблемой видимости вводимых символов при использовании TTouchKeyboard, следует рассмотреть возможность создания собственного класса кнопки, который позволит скрыть отображение нажатых клавиш. Это простое и эффективное решение позволит улучшить безопасность ввода паролей без необходимости кардинальной переработки существующего кода.
Проблема защиты вводимых паролей на сенсорной клавиатуре Vcl.Touch.Keyboard.TTouchKeyboard в Delphi решается путем изменения отображения нажатых клавиш для повышения безопасности.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.