我将用户的密码加密后存入SQL里,用户登陆的时候再按照用户名把相应的加密后的密文从数据库里读出来解密后和用户输入的密码相比较以判断密码是否正确
,因为密码是不定长的而且加密后的密文结尾可能存在空格,现在遇到一个问题:如果我在SQL里把保存用户密码密文的数据类型设置为varchar,数据长度设置为30,那么如果加密后的密文结尾包括有空格,那么读取出来的密文将不包括空格,这就造成了解密不正确。如果在SQL里把保存用户密码密文的数据类型设置为char,数据长度设置为30,那么在读取数据库里密文的时候,得到的数据长度是定长30,不足30系统会自动用空格填充,如果把空格截取掉的话,那么密文本身结尾处包含的空格也将被截取,导致解密不正确我目前想到的变通办法就是在数据表里再添加一个字段用来纪录加密后的密文长度
但是这样以来,我以前写的很多代码都需要修改!很麻烦,还有没有更好的办法?

解决方案 »

  1.   

    试试把保存用户密码密文的数据类型设置为blob;或者改进密码算法;(比方说先用base64加密)就把3个byte变成4个byte.
      

  2.   

    我觉得不要解密后验证,你在比较的时候,把登陆新输入的密码,加密后和数据库取出来的加完密的密码验证。
    根据你数据库存储格式去掉空格再比较。如果你的算法够复杂的话,输入不同密码,生成的加密后密码只在末尾差几个空格是不大可能的。(有些算法是通过用户名和密码,进行一定变化后生成新密码的,雷同的可能性很小)。呵呵,仅供参考,hope you good luck!
      

  3.   

    so complex ...I think u'd update ur algorithm of cryptography See the link below, FYI:http://www.codeproject.com/cpp/#Cryptography
      

  4.   

    hediant(何) 的方法和我的一样。应该是用加完密后的密码进行比较的。而且,为了安全起见,一般是用不可逆算法的。数据库中的密码是没法得出原来密码的。
    如果用户丢失了密码,是向数据库中写入一个新值,而不是取出旧的告诉他。
      

  5.   

    同意:52001314(passenger) 、hediant(何)