安全键盘

7c6cd6ebe9b41e9ed1b4e828dd60cf25.png

安全键盘的主要目的是保护用户在输入敏感信息(如密码、银行卡号等)时,防止被键盘记录器(Keyloggers)或者恶意软件窃取。

以下是一些常见的安全键盘保护原理:

随机键位:每次打开键盘时,键位的排列顺序都会随机变化。这样即使有人通过屏幕截图或者录屏的方式记录下用户的点击位置,也无法推断出用户实际输入的内容。

加密传输:安全键盘在获取到用户的输入后,会对数据进行加密,然后再传输给应用。这样即使数据在传输过程中被截获,攻击者也无法直接获取到用户的原始输入。

防截屏:一些安全键盘会阻止屏幕截图或录屏,以防止攻击者通过这些方式获取用户的输入。

独立进程:安全键盘通常会运行在一个独立的进程中,与其他应用隔离,这样即使其他应用被恶意软件感染,也无法影响到安全键盘。

防键盘记录器:安全键盘会采取一些措施防止键盘记录器记录用户的输入,例如使用虚拟键盘,或者在用户点击键盘时不生成键盘事件。

需要注意的是,虽然安全键盘可以提供一定程度的保护,但并不能防止所有的攻击。例如,如果用户的设备已经被恶意软件完全控制,那么攻击者可能仍然能够通过其他方式获取用户的输入。因此,用户仍然需要保持良好的安全习惯,例如定期更新软件,不下载不明来源的应用等。

为提高微信开放平台生态安全性,针对小程序内数字密码输入场景中可能存在的安全问题,微信侧在input组件开放了安全键盘类型。通过引入安全键盘,小程序可以在用户输入过程中对关键信息时进行加密,防止键盘窃听,内存保护,有效保障用户数据资产的安全。

<input 
  style="border: 1px solid blue;"
  type="safe-password"
  placeholder="123456"
  safe-password-cert-path="/minipro_test_cert.crt" 
  safe-password-time-stamp="1618390369" 
  safe-password-nonce="1618390369" 
  safe-password-salt="zefengwang" 
  safe-password-custom-hash="md5(sha1('foo' + sha256(sm3(password + 'bar'))))"
  bind:blur="onBlur"
  bind:input="onInput"
  value="{{value}}"
></input>
<button bind:tap="onClear">clear</button>


<view>{{detail}}</view>

小程序安全键盘采用非对称加解密算法,该算法需要两个密钥,一个叫公钥,可以公开,另一个叫私钥,需要私密保管。其中公钥加密的密文,只有私钥才能解开,而且通过公钥没办法计算出私钥,这样黑客即使拿到公钥也没办法解密密文。我们一般把公钥放到客户端上(比如小程序环境)做加密,私钥放到业务后台,这样就只有后台才能解密。黑客比较容易攻击本地客户端,但是攻破后台则难很多,甚至有些业务把私钥存储到硬件加密机芯片里面,这种情况黑客更是没办法获取得到私钥,因此采用非对称加解密算法是安全键盘推荐的模式,安全性可以得到保障。为了保证私钥的私密性价值,我们要求不同的小程序业务使用自己独有的公钥私钥对,这样就可以完美的做到业务加密的数据隔离,业务A的公钥加密数据,就只有业务A自己的私钥可以解开,业务A的责任就是负责保护好自己的独有私钥即可。为了证明一个公钥是属于业务A的,我们会颁发一个数字证书给到业务A的开发者,数字证书由腾讯官方签名,保证了可靠性与不可篡改性,数字证书里面会绑定一个业务独有的公钥, 业务的私钥是在向腾讯申请数字证书的过程中产生的,业务负责管理好自己的私钥,这个过程中,腾讯仅能接触到公钥,没办法得到业务自己的私钥,意味着即使是腾讯也没办法去解密小程序业务的用户输入的密码口令。为了国家合规的要求,我们颁发的是国产密码算法的数字证书,意味着非对称加解密算法是使用sm2算法,而非rsa等国际算法。

不同小程序业务,可能要加密的数据的格式可能有不同的要求,比如当用户输入的口令是“123456”,有些业务直接对明文做加密即可, 有些业务可能想先做一个哈希处理再加密,比如使用md5("123456"), 做了哈希后,能更有效的保护用户的明文密码,让业务都不好推测用户实际密码是什么, 另一些业务可能采用sha1哈希算法sha1("123456"), 也有业务采用更合规的国产密码哈希算法sm3(“123456”),甚至有些业务希望加上一些混淆字符(密码学中叫加盐)到口令明文里面,做更好的保护,就可能会变成sm3("123456+abc"), 这里面"+abc"就是额外加上的混淆字符示例。所以为了能让不同的小程序业务有符合自己业务需求的加密格式,小程序安全键盘也开放了密码格式配置的能力,从而更好的跟自己的整体业务结合在一起,但是这个格式做不到万能兼容所有,所以当你应用小程序安全键盘的时候,可能会涉及部分后台验密服务的改造工作量,请提前评估可行性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模拟安全键盘的主要目的是为了防止钓鱼攻击和键盘记录器攻击。在Python中,可以使用Tkinter库来创建GUI应用程序,然后创建一个虚拟的安全键盘。 以下是一个示例代码,可以创建一个带有数字和字母的虚拟安全键盘: ```python from tkinter import * root = Tk() root.title("Virtual Keyboard") def select(value): """将用户选择的值添加到Entry框中""" entry.insert(END, value) # 创建一个Entry框 entry = Entry(root, width=50, borderwidth=5) entry.grid(row=0, column=0, columnspan=3, padx=10, pady=10) # 创建安全键盘的按钮 button_1 = Button(root, text="1", padx=40, pady=20, command=lambda: select("1")) button_2 = Button(root, text="2", padx=40, pady=20, command=lambda: select("2")) button_3 = Button(root, text="3", padx=40, pady=20, command=lambda: select("3")) button_4 = Button(root, text="4", padx=40, pady=20, command=lambda: select("4")) button_5 = Button(root, text="5", padx=40, pady=20, command=lambda: select("5")) button_6 = Button(root, text="6", padx=40, pady=20, command=lambda: select("6")) button_7 = Button(root, text="7", padx=40, pady=20, command=lambda: select("7")) button_8 = Button(root, text="8", padx=40, pady=20, command=lambda: select("8")) button_9 = Button(root, text="9", padx=40, pady=20, command=lambda: select("9")) button_0 = Button(root, text="0", padx=40, pady=20, command=lambda: select("0")) button_q = Button(root, text="Q", padx=40, pady=20, command=lambda: select("Q")) button_w = Button(root, text="W", padx=40, pady=20, command=lambda: select("W")) button_e = Button(root, text="E", padx=40, pady=20, command=lambda: select("E")) button_r = Button(root, text="R", padx=40, pady=20, command=lambda: select("R")) button_t = Button(root, text="T", padx=40, pady=20, command=lambda: select("T")) button_y = Button(root, text="Y", padx=40, pady=20, command=lambda: select("Y")) button_u = Button(root, text="U", padx=40, pady=20, command=lambda: select("U")) button_i = Button(root, text="I", padx=40, pady=20, command=lambda: select("I")) button_o = Button(root, text="O", padx=40, pady=20, command=lambda: select("O")) button_p = Button(root, text="P", padx=40, pady=20, command=lambda: select("P")) button_a = Button(root, text="A", padx=40, pady=20, command=lambda: select("A")) button_s = Button(root, text="S", padx=40, pady=20, command=lambda: select("S")) button_d = Button(root, text="D", padx=40, pady=20, command=lambda: select("D")) button_f = Button(root, text="F", padx=40, pady=20, command=lambda: select("F")) button_g = Button(root, text="G", padx=40, pady=20, command=lambda: select("G")) button_h = Button(root, text="H", padx=40, pady=20, command=lambda: select("H")) button_j = Button(root, text="J", padx=40, pady=20, command=lambda: select("J")) button_k = Button(root, text="K", padx=40, pady=20, command=lambda: select("K")) button_l = Button(root, text="L", padx=40, pady=20, command=lambda: select("L")) button_z = Button(root, text="Z", padx=40, pady=20, command=lambda: select("Z")) button_x = Button(root, text="X", padx=40, pady=20, command=lambda: select("X")) button_c = Button(root, text="C", padx=40, pady=20, command=lambda: select("C")) button_v = Button(root, text="V", padx=40, pady=20, command=lambda: select("V")) button_b = Button(root, text="B", padx=40, pady=20, command=lambda: select("B")) button_n = Button(root, text="N", padx=40, pady=20, command=lambda: select("N")) button_m = Button(root, text="M", padx=40, pady=20, command=lambda: select("M")) # 将按键添加到窗口中 button_1.grid(row=1, column=0) button_2.grid(row=1, column=1) button_3.grid(row=1, column=2) button_4.grid(row=2, column=0) button_5.grid(row=2, column=1) button_6.grid(row=2, column=2) button_7.grid(row=3, column=0) button_8.grid(row=3, column=1) button_9.grid(row=3, column=2) button_0.grid(row=4, column=1) button_q.grid(row=5, column=0) button_w.grid(row=5, column=1) button_e.grid(row=5, column=2) button_r.grid(row=6, column=0) button_t.grid(row=6, column=1) button_y.grid(row=6, column=2) button_u.grid(row=7, column=0) button_i.grid(row=7, column=1) button_o.grid(row=7, column=2) button_p.grid(row=8, column=1) button_a.grid(row=9, column=0) button_s.grid(row=9, column=1) button_d.grid(row=9, column=2) button_f.grid(row=10, column=0) button_g.grid(row=10, column=1) button_h.grid(row=10, column=2) button_j.grid(row=11, column=0) button_k.grid(row=11, column=1) button_l.grid(row=11, column=2) button_z.grid(row=12, column=0) button_x.grid(row=12, column=1) button_c.grid(row=12, column=2) button_v.grid(row=13, column=0) button_b.grid(row=13, column=1) button_n.grid(row=13, column=2) button_m.grid(row=14, column=1) root.mainloop() ``` 在上面的代码中,我们使用`Tkinter`库来创建窗口和按钮。当用户点击按钮时,`select()`函数将被调用,它将用户选择的值添加到Entry框中。 该代码可以在Python 3中运行,并且已经测试过。但是需要注意的是,这只是一个简单的示例,并不是一个真正的安全键盘。如果您需要一个真正的安全键盘,请参考专业的安全键盘产品。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值