You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ada中实现终端输入不可见方法咨询:密码安全输入需求

在Ada中实现密码安全输入(终端输入不可见)

1. 使用GNAT自带工具链的解决方案

GNAT原生提供了GNAT.Terminal_Control包,无需额外依赖,可直接控制终端回显模式实现密码输入的不可见效果。核心逻辑是先保存终端原始状态,临时关闭回显,读取输入后立即恢复原始模式——必须在异常场景下也执行模式恢复,防止程序崩溃后终端一直处于无回显状态。

示例代码:

with GNAT.Terminal_Control; use GNAT.Terminal_Control;
with Ada.Text_IO; use Ada.Text_IO;

procedure Secure_Password_Input is
   Max_Password_Length : constant := 20;
   Password : String (1 .. Max_Password_Length);
   Input_Last : Natural;
   Original_Terminal_Mode : Terminal_Mode;
begin
   -- 保存终端初始模式
   Get_Terminal_Mode (Original_Terminal_Mode);
   -- 关闭终端回显
   Set_Terminal_Mode (No_Echo);

   Put ("请输入密码: ");
   Flush; -- 强制输出提示信息,避免终端缓冲导致提示延迟
   Get_Line (Password, Input_Last);
   New_Line; -- 输入完成后换行,恢复正常视觉体验

   -- 恢复终端原始模式
   Set_Terminal_Mode (Original_Terminal_Mode);

   -- 此处添加密码验证/业务逻辑
   Put_Line ("已输入密码长度: " & Natural'Image(Input_Last));
exception
   when others =>
      -- 异常场景下强制恢复终端模式
      Set_Terminal_Mode (Original_Terminal_Mode);
      raise;
end Secure_Password_Input;

关键注意点:

  • 调用Flush确保提示文本立即显示,否则终端缓冲可能导致输入完成后才出现提示。
  • 若未在异常块恢复模式,终端会保持无回显状态,需手动执行stty sane命令恢复。

2. 第三方库选项

如果需要更封装的跨平台终端交互能力,可使用Ada_Curses库,它提供了现成的密码输入接口。可通过Alire包管理器安装:

alr install ada-curses

Ada_Curses简化示例(核心调用):

with Curses; use Curses;

procedure Curses_Password_Input is
   Password : String (1..20);
   Last : Natural;
begin
   Init_Screen;
   Last := Get_Password (Password, "请输入密码: ");
   End_Window;

   -- 此处添加密码处理逻辑
end Curses_Password_Input;

内容的提问来源于stack exchange,提问作者khv2online

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:09:24