今天和同事讨论到一个关于数字签名算法的问题。我们通过修改数字签名的文件的内容,验证数字签名的有效性。发现的现象是只要文件的内容相同,无论中间过程中被修改过多少次,它们的数字签名都有效。
打开被数字签名过的JS文件,发现文件的末尾有一段固定长度的字符串,这个固定长度字符串就是数字签名的验证文件。我们猜想它是这样进行验证的,一段内容(即我们文件的内容,无论内容多长),经过一个加密算法以后,都会生成一段固定长度的字符。如果在查看数字签名时,由文件内容再次根据此算法生成的字符串与文件数字签名时得到的字符串完全匹配,那证明这个文件自数字签名以来没有被改动过,即该数字签名有效。否则无效。
幸运的是这样的一个加密算法是不能逆向的,就是你无法从一个固定长度的字符串反推出文件的内容。但是也有人证明了这种算法的缺陷,那就是一定存在内容不同的两个文件,通过这个算法所得到的固定长度字符串相同。但这样的两个文件是无法预知的,即可遇不可求。从一定角度出发看,数字签名还算是安全的。
就是这种不能逆向的加密算法,为网站存储用户密码提供了一个好方案。每次用户登录时,网站将用户本次输入的密码通过这样的加密算法生成一个字符串,然后拿这个生成的字符串和先前用户设置密码时生成并存放在数据库中的字符串匹配,如果完全匹配,则大概可说是本用户。如果各大网站是采用类似算法来加密用户的密码的,那就再也不用担心用户的秘密被内部泄露了。