问一个小白问题 今天在折腾 rubycas-server,实现了单点登录功能。 但是在密码一栏里需要输入数据库中保存的密文才能登录成功。 想要问问在哪个文件里修改才能实现将明文转化为密文后,再进行登录的验证。 看了很多遍代码,可能是自己能力有限,没能找到修改方法,问题比较低级,大家误见笑~ rubycas 的版本是 1.1.2
https://code.google.com/p/rubycas-server/wiki/UsingTheSQLEncryptedAuthenticator
在这找到这句:
class: CASServer::Authenticators::SQLEncrypted
文档里只有这句:
class: CASServer::Authenticators::SQL
#2 楼 @Peter 呃,我是这么去理解这个事情的。 首先,用户的密码的作用就是校验使用个密码的人是否为真正知道这个密码的那个人。而校验的过程就是提交一个密码与数据库中保存的密码相互比较,看是否匹配。那么最简单的,数据库中保存的密码为:123,提交的内容为:123,匹配通过。 但是这样是不安全的,不论通过何种方式,数据一旦泄漏,那么,用户的密码就也随之泄漏。所以,我们就要考虑使用加密。 在数据库中保存密码密文,而用户提交密码明文,通过加密算法,将用户提交的密码明文转换成密码密文,再与数据库中的密码密文匹配。在这种情况下,数据泄漏后,得到数据的人看到的是密文,在一定程度上可以降低密码泄漏的风险。但仍然不是最理想的方式,因为加密算法在概念上是有加密算法和解密算法两个流程,这两个流程是互逆的。即,如果得到数据库的人,碰巧也能通过一定的方法破解你的加密方式,并实现了与之对应的解密算法,那么,他得到的密文其实也就相当于明文了。 所以,下面就要介绍一下摘要算法,摘要算法与加密算法最大的区别就是不可逆,即无法通过密文得到与之对应的明文。那么,在当密文泄漏后,无法通过完成一个解密算法来进行逆运算。只有通过暴力破解,就是用大量的排列组合去通过摘要算法得到密文后再去匹配,这个工作量几乎是无法估量的。目前著名的摘要算法有 RSA 公司的 MD5 算法和 SHA-1 算法及其大量的变体。但是 MD5 算法前几年貌似被中国的一个女学者破解了,那是我大学时候的事情,已经记不太清楚了。 以上,都是个人理解,你将就这看看吧~
#3 楼 @lionzixuanyuan 谢谢你的耐心科普。
我还想问一下,你的系统最后是怎么做的呢?是不是在 config.yml 里面用的这句:
class: CASServer::Authenticators::SQLEncrypted
#6 楼 @lionzixuanyuan 谢谢,我发第一帖的时候是因为没找到相关文章,他们搬去 github 后,wiki 里面就好像没有提SQLEncrypted
了。
我觉得 RubyCAS 无论如何也不应该提供明文保存密码的方式
后来我找到文章后,就想跟你确认一下,你是不是也是用的这个方法。网上介绍 RubyCAS 的好像不多啊,他们官方文档介绍也不全面。
我也没细看,但我觉得 RubyCAS 无论如何也不应该提供明文保存密码的方式,在 Wiki 里面这么介绍,说不定真有人这么用,如果让程序员能看到别人的常用密码,这不是引诱人犯罪吗?
@lionzixuanyuan 又来打扰你一下,
Rubycas-server 只搞定了三件事情,对数据库是只读操作 login_url = "https://cas.myorganization.com/login" logout_url = "https://cas.myorganization.com/logout" validate_url = "https://cas.myorganization.com/serviceValidate"
那用户注册,忘记密码,邮件验证之类的功能是不是要自己另外写个 Rails 程序来搞定?而且这个 Rails 要和 Rubycas-server 共用一个数据库,实现用户信息的写操作?
不知道直接用 Devise 是不是就可以搞定了,你是怎么做的呢?
补充个比 Rubycas-server 更好的程序: http://www.codinghell.ch/blog/2013/03/30/casino-an-easy-to-use-single-sign-on-sso/
#12 楼 @lionzixuanyuan 请教一下,你是不是自己另外写个 Rails 程序来搞定用户注册,忘记密码,邮件验证之类的功能?有没有可能给我一份代码呢,谢谢!
谢谢回复,知道你是自己写的就很有帮助了,至少我方向没错。网上也没有参考代码,下面的这种逻辑如果没有人做过,我猛然下手,怕走弯路,所以才多次麻烦你:
如果一个用户 Tom 在 A.com
注册,那用户名 Tom 应该记录在 A.com 的用户表中,同时要把用户名 Tom 和对应的密码保存在 Rubycas-server。
如果还有一个网站 B.com
,那 Tom 在登录 B.com
的时候,B 系统的用户表还没有 Tom,那就应该从 Rubycas-server 得到了 Tom 的用户名,然后写入 B.com
的用户表
rubycas-server 中不保存任何用户数据的,它只是读取 A.com 的数据库,判断用户的登录行为是否合法; B.com 中没有用户数据,也无法从 rubycas-server 中获取用户数据,所以,B.com 从 rubycas-server 中得知用户登录成功,并且在自己用户表中没有检索到对因的用户信息,那么 B.com 应该为这个用户新建一个 B.com 中的账户,然后让用户自己去完善这个账户。你可以参考下许多支持 qq 登录的论坛网站的做法
#15 楼 @Peterrubycas-server中不保存任何用户数据的,它只是读取 A.com 的数据库,判断用户的登录行为是否合法; B.com 中没有用户数据,也无法从 rubycas-server 中获取用户数据,所以,B.com 从 rubycas-server 中得知用户登录成功,并且在自己用户表中没有检索到对因的用户信息,那么 B.com 应该为这个用户新建一个 B.com 中的账户,然后让用户自己去完善这个账户。你可以参考下许多支持 qq 登录的论坛网站的做法