西西河

主题:【原创】也说一下关于密码的问题 -- yhz

共:💬34 🌺46
全看树展主题 · 分页首页 上页
/ 3
下页 末页
家园 【原创】也说一下关于密码的问题

最近,不知道为什么,河里有不少人开始关注自己的密码问题了。也许是经济不好,所以更要好好的看好自己的钱包?呵呵。

但是什么是好的密码?这个问题看上去简单,但是其实并不简单。当然,从哲学上来说,总有一个放之四海而皆准的标准答案,就是:密码的好坏没有一个统一的标准。嗯,显然,这个标准答案在这个问题上再次成立。那么,要怎么弄,能得到一个好的密码呢?

在回答这个问题之前,就必须先明确一点:设计安全的密码,不是我们的目的。我们的目的是保护我们的隐私或者重要资料不外泄,而密码仅仅是达到这个目的手段之一。木桶能装的水,取决于最短的木板的道理,大家应该都知道了。在安全体系中也一样,所以,追求单纯的密码安全,其实有时候是没有太大的必要的。

首先,要看看你准备把这个密码用在什么地方。例如说在银行中用的密码?还是计算机系统密码或者网站的登陆密码?

这点区别的意义是什么呢?首先,大多数人都可以回答出来:银行中用的密码一般只能有6位10进制数,而网站上用的是英文字符加大小写加特殊符号。这个答案答对了一半,如果打分,就只能打40分。因为最重要的另一半,是我们对密码设计的重点,是有所不同的。如果是银行的6位10进制数,那么,我们的密码设计中,防范的重点应该是对密码的猜测上。而如果是计算机系统或者网络某个登陆密码,则重点防范的则是暴力破解。这点的区别,似乎很多人忽略了。

具体来说,银行的密码,大多数是6为10进制数(有不同的,自己类推一下,结论肯定是类似的)。那么它们的组合一共有多少呢?很简单,10^6种,也就是一百万种?多吗?一点都不多:一个一百万的码本,占用的空间,顶多就是几十兆一百兆字节,而遍历这个码本(一百万次匹配),对于对于现代计算机的运算能力而言,再差的算法,也绝对能在一分钟内完成。所以,这种密码体制,对于暴力破解而言,是极其脆弱的,甚至可以认为是不设防的。所以,我们对防范暴力破解的希望,就只能在银行提供的服务上了:银行既要防止对同一个账号连续测试,也要通过内部安全措施,防止银行职员越权获得密文等等。在这点上,我们无能为力,只能相信银行,相信它提供的安全机制,能够防范来自内部和外部的暴力破解。所以,我们设计出来的密码,需要防范的重点,是防止有人利用我们的某些公开信息,不经过暴力破解,或者仅经过少量测试,猜测出密码来。

而对计算机系统或者网站登陆密码而言,大多数情况下,只要是键盘上能打出来的,就是可接受的。所以,密码的组合就可以呈现出一个近乎天文数字的结果。这使得单纯的枚举式暴力破解,几乎是不可能的。而且,由于大部分这些系统,都采用了现代成熟的商用密码安全算法,例如说哈希算法:MD5/SHA1,也有些网站用对称算法例如:DES/AES/IDEA等等,以保留一个反向获取密码的能力(虽然用对称算法的密文保存密码的安全性稍低,但是反向获取密码的最大作用,是当大家忘记密码时,它可以发送密码到先前设置的安全邮箱中)。对于这些安全体系而言,对于普通的破译者的技术水平来说,纯密文的安全性是可以得到保证的(如果NSA、CIA、FBI盯上了你,算我没说)。所以,通常用的方法,就是字典式的暴力破解。所以,对于这种体系,我们的密码设计的重点,就是防止这种字典攻击,简而言之,就是构造出一个在绝大多数破译者使用的字典中都不存在的密码组合。

其次,使用的便捷性。其实在密码学上,有一个很基本的通则,就是越是好的密码,或者安全措施,基本上给使用者带来的不便就越大。而当一些不便大到一定程度的时候,使用者就会用各种偷懒的手段去绕开这些安全措施或者原则。例如说,河里已经有不少的大牛,根据自己的经验或者实际使用的情况,给出了很多生成密码的方法和方式,甚至是需要演算叠加而得来的。这种方法当然是好的,但是,如果一个非常安全的密码,为了算出来,你需要在电脑边上拿纸和笔算上三分钟,或者站在ATM机旁边心算十分钟才能算出来的话,那么我敢打赌,99%的人在使用不超过十次的时候,就会开始用各种偷懒的方法了。例如说偷偷的把演算结果写在某个地方,或者干脆改密码等等。所以,千万不要高估自己的耐心。当然,这种耐心,还有心算能力,是每个人都不同的:陈景润苏步青十秒钟心算出来的东西,我们可能十分钟也未必算出来--算出来的,还不一定是对的。所以,这个要因人而异,自己掌握。

再次,就是密码的使用--也就是有人提到的分级的概念。一般而言,对你很重要的密码,例如说银行密码,一定不要用在一些对你而言无关紧要的地方。因为多一个地方用这个密码,就多一重泄露的可能性。所以,理论上说,每个不同的地方,就使用不同的密码,显然是最佳选择。但是考虑到上面所说的便捷性,除非自己使用密码的地方很少(在现代社会这点似乎不太可能),不然,就需要做出一定的权衡。密码的分级处理策略,是比较简单可行的。密码分级的核心原则就是,分出不同级别的使用场合,同一级别内,用同一个密码,或者同一个算法生成的密码。不同级别的场合,绝不混用密码。所以,我们还要看看密码在什么地方使用的。例如上面说的,如果一个网站提供了忘记密码找回的功能,那么,他肯定用了一些可逆的算法来保存你的密码(也就是说可从密文直接恢复出明文的算法)。这类算法,无论是对称算法还是非对称算法,他们的安全性完全在密钥上面。也就是说如果一但这个网站的加密解密用的密钥被获取,那么这些密文,对于破译者来说,就毫无安全性可言了。所以,如果碰到这些网站,如果是大公司,或者你认为信得过他们的安全技术人员和内部的安全规章和措施,并且能认真执行的话,可以用一些级别比较高的密码。不然的话,就不要过于相信这些网站。以免一但一个被泄露,就一连串的遭殃。比较好的做法是,为这些网站,单独划定一个级别,一但出问题,也不至于全军覆没。

最后,谨记一个原则:对于非安全相关专业人士(一句老话:如果不知道你是不是专业人士,那么说明你不是)而言,你所设计的密码或者算法,都是业余级的,永远不要指望能抵挡专业人员或者机构的破解和攻击。简而言之,就是防君子不防小人的。谁是小人?呵呵,看多点美剧或者好莱坞的大片,大家都应该猜到的。

开始准备就说两句的,结果越说越多。俗话说说得越多,错得越多。我觉得在藏龙卧虎高人无数的河里,更是如此。先躲起来,看看有没有人觉得班门弄斧糊弄大众?大家有西红柿和鸡蛋尽管丢,不过力气小一点,不要砸破了--现在经济不好,我今天的晚饭,就指着西红柿炒鸡蛋了。

关键词(Tags): #密码(landlord)

本帖一共被 2 帖 引用 (帖内工具实现)
家园 沙发

这个,不要密码吧?

沙发
家园 老萨今天心情好象不错呀,连着抢了几个沙发

猎杀非洲豹 二十一 还没贴过来呢,还好我去看了

家园 看《暗算》,觉得密码好神秘啊
家园 银行的密码不需要太复杂,只要别人猜不出来就行了。

  ATM机上连续三次输错就会吞卡,到柜台营业员也不可能让你久猜下去。

  所以银行的密码不需要太复杂,只要不用自己的一些公开信息如电话、生日等,但要好记。

  俺的密码告诉了组成方法别人也没法猜,是俺第一次有办公室的房间号,而且在有银行密码前已经被油漆复盖(装修),现在大概全位也没几个人记得俺的房间号。

家园 《暗算》讲的是密码

楼主说的密码其实应该叫“口令”。

不过现在大家都这么叫,也就事实标准了。

家园 【原创】也说一下关于密码的问题(二)

昨天发完文章就回家了。

今天回来一看,居然是萨老大的沙发,真让人想不到啊。

既然也有好几位朋友捧场,那么就多说两句,关于密码具体的设计吧。

首先,大家最关心的,应该就是银行密码吧?6个简单的数字,就关系到我们的真金白银,不重视一点是说不过去的。

但是正如我的上一个帖子所说的,仅仅依靠6个10进制数字,就想抵抗暴力攻击是不可能的。所以,我们的重点,就是要抵抗猜测攻击上。抵抗猜测攻击,最简单的做法就是让自己的密码具有足够的随机性。但是问题在于,对于大多数人来说,足够随机的密码,其实并不好记。一个两个,还可以。要是到了十个八个,还要分别对号入座的时候,如果自认为自己记得过来的,那么恭喜你,你有足够好的记忆力,可以使用最好的密码策略来保护你自己的财产。当然,下面的文章就和你无关了。

那么,在我们无法记住那么多的随机数,但是又有很多不同的银行账号的时候,怎么办呢?有些人就把所有的账号都设成同一个密码。这当然不是不可以,但是从安全性的角度来说,其实并不太让我们放心。因为如果这个密码一但泄露,那么攻击者肯定会用同一个密码去尝试自己的其它账号。

所以,好的银行密码,应当具有以下几个特征:

一:足够的随机性。这样可以确保猜测者无法通过我们的某些信息把密码猜测出来;

二:足够的差异性。这样可以让自己不同的账号,有不同的密码,一定程度上确保自己的账号不会一损俱损。

三:足够的方便。这点好处不用我多说了。

首先,一个数学原理是:初等的数学变换,是不会带来随机性的。也就是说,如果希望结果足够的随机,那么就只能指望参加运算的因子(密码学中称为种子)足够随机。所以,第一件事,就是要挑选一个足够随机的数字串,而且,这个数字串的长度,必须大于或等于密码的长度。

挑选随机数字串的方法有很多,例如说:

1001n推荐的路上随机挑选的车牌号码(千万不要挑自己的);

或者下载个随机数软件生成;

备选的,不过我个人也不推荐的方案有:

njyd的办公室房间号(大多数房间号都有一定的规律,不够随机);

jet的mm生日组合(要有足够多的mm,才能用此大法,否则一猜就中--不过也说明jet大哥应该艳福不浅吧?)。

因为这个随机数的随机性,直接影响密码的健壮性,所以看似简单,但是我觉得还是不要偷懒。为了这么一点点的侥幸和偷懒而冒一个没有必要的风险,我觉得不大值得。反正,无论如何,找一个于自己认为足够随机6位数字串,然后死死的记住它。这样,我们就有了一个足够随机的种子,来保证我们的结果有足够的随机性(当然,不保证这点,随机性在初等数学变换中不会增加,但是可能会减少)。最重要的是:记住它,并且千万不要告诉任何人,也不要把它记在任何地方

然后,我们要考虑的,就是如何构造一个算法(规则),让自己不同的银行账号表现出不同的密码了。方法当然有很多,但是一个起码的原理是,我们需要另一个数字串和刚才记下来的随机数运算。只要不同的账号,取不同的串,那么我们的目的就达到了。

在这里我个人推荐用银行账号或者银行卡中提取6个数字参与运算。提取的方式有很多,这点上,大家可以充分发挥自己的创造力和聪明才智:

最简单的是取账号的最末6位数字(不要取开头的,因为银行账号几个开头的数字一般有特定的格式);复杂一点的可以是把账号最末一位作为偏移值,然后从最末尾倒推这个偏移值后提取出来。

当然,如果还是觉得复杂的,那么可以用账号A和mmA的生日关联,账号B和mmB的生日关联等方式。

现在,我们有了两组数字串:一组随机的数字串,一组跟随账号的数字串。我们的最后一步,就是找一种算法,把二者合并起来。一个比较正统的方式,就是按位叠加取模法。方法很简单:把两个数字相加的和的个位数,就是结果。这个算法,其实就是十进制版本的按位异或,写程序搞算法的应该都不太陌生。例如说:123456和234567运算的结果,就是357913。这种算法的优点,就是不会丢失随机性,缺点就是对心算能力有一定的要求。

如果觉得自己心算能力不强的,也可以采用替换法--就是把一组数字中取出一些数字来替换另一组数字。例如说奇替换,就是123456替换234567后,结果为133557,偶替换类似。至于是奇替换还是偶替换,可以参考账号上最后一位数字的奇偶性来决定。这种替换法的优点,就是简单方便,而且每个人都可以自己别出心裁的想出一些替换的招数,怪招很多,缺点就是会丢失部分的随机性。

最后,简单总结一下这个算法:

一:找到并记住一个随机数;

二:记住一个和账号相关的数字;

三:把两个数字运算并生成最终的密码。

家园 其实是一回事

“密码”和“口令”,其实是对Password的翻译不同而已。

真正密码算法中,用的是其实是“密钥”(有些能看到“密匙”,应该也是翻译不同的原因)这个词。对应的英文一般是Key,包括衍生出来的:Encryption Key(加密密钥)/Decryption Key(解密密钥)/Symmetric Key(对称密钥)/Public Key(公开密钥)/Private Key(私密密钥)等等。

家园 俺的房间号是三位。

  加一个楼号,再自己加两位变成六位,只要记住两位就行了。至于这两位在三次的限制下也很难猜,还有楼号加在前还是后别人也搞不清楚,自己加的两位也可以前后变化。

  重要的是银行卡的输入是有次数限制的。

  还有,俺已经换过多个办公室,近三十年已经换过不下十个房间,最早是哪个房间现在也顶多有两三个人知道。

家园 【原创】也说一下关于密码的问题(三)

再接再厉,说一下计算机中使用的密码。

其实1001n在他的大作中已经提到了一些生成算法。他的算法通用性很好,但是稍微复杂了点。在这里,准备向大家透露一个简单而又足够强大的高级技巧:非可见字符大法。

什么是非可见字符呢?

熟悉计算机的应该都知道,ASCII字符集中,只有32到126的字符是可以正常的显示为我们的各种英文大小写和标点符号。在这个范围之外的字节,其实在显示的时候,是无法正常的被解析为有显示意义的字符的(也就是我们俗称的乱码)。

下面先给大家演示一些特殊的非可见字符,括号内是实际的ASCII值:

(130)

(140)

还有很多字符,实际的ASCII值不同,但是显示出来的乱码是相同的:

(195)

(196)

还有一些,是无法显示的空格,当然,那不是ASCII码为32的正牌空格:

(160)

这些乱码在写文章的时候还是有的,但是提交之后,就真的变成了“非可见字符”了。晕

有意思吧?

例如说,如果我们在密码中加入了一个或者几个这样的值,有谁的字典能猜到?而且即使猜到了,显示出来的,也未必能看得出来区别,有很多是ASCII值不同,乱码相同的情况。

那怎么才能输入这些非可见字符呢?

首先,大家先确认一下自己键盘有没有数字小键盘。记住不是qwerty键盘上的那一排数字键,而是一般在右边,1-9呈3×3排列的那个小键盘。如果是笔记本,一般是按Fn+NumLock开启(基本上都有这个设计,具体方法看说明书)。

然后,随便打开一个记事本,按照一下步骤做个小实验:

一:左手先按着qwerty的Alt键不放(左右两个Alt键,任意一个都可以);

二:在小键盘中输入你想要的ASCII字符的数字(推荐大于127,小于255的)。你可以注意到,这时你虽然在小键盘按了好几个字符,但是没有字符真正被显示出来;

三:松开Alt键。这时,就可以看到一个乱码出来了。

如果你的实验成功了,那接下来,在你的密码中,在什么地方加入一个或几个这样的非可见字符,就看自己喜欢了。

最后,再补充一下,这种方式输入的字符,除非有明确限定密码字符范围的地方,否则,在很多地方都是适用的。最起码的,操作系统登陆的密码,基本上都可以这么用,Windows/Linux/Unix等等地方都是可以用的。没记错的话,也包括西西河。

另外,以前也见过一个帖子,故弄玄虚的弄了一个算术式,然后让人用这种方式去输入算术式得出的结果,然后说出来的字就是你。当然,大家算出来的ASCII值都是55021,究竟会出来个什么字,大家可以自己看看。

呵呵。

家园 呵呵,不好意思

拿了你作为例子,多有冒犯,还望海涵。

其实密码这个东西,确实是因人而异的。

有人觉得不够复杂,有人觉得这就够了。

就像我第一篇所说的:

密码的好坏没有一个统一的标准。

我只是提供一些建议和常见的处理策略和手段。

至于最后具体的取舍,如何平衡各方面的因素,还是要自己决定的。

家园 确实是因人而异。

  还有个使用密码处的防范,如果可以用穷举法,还可联网,大概十几位也很容易破解。

  银行卡只能错两次,第三次就吞卡,我觉得四位就够了。

家园 口令和密码其实是不同的概念

如楼下七月半已经指出的那样。

日常中使用的“密码”一词,绝大多数是指口令,1001n说的故事才是真正的密码。

语言文字已经被污染了,大家都有义务纠正过来,你既然说这个话题,就应该规范用词,这是许多有识之士曾经在西西河呼吁过的。

家园 password应该就是“口令”,不是“密码”

老兄写的很好,受教了。

但是在这个小问题上还是想和兄抬一下杠

想象一下:

军营门前,月黑风高,突然细琐声响,人影闪动,哨兵“啪”的端枪一指,断喝:

“口令!”

“胜利!”

“嗯,自己人,过去吧。”

这就是password啊,能够让您pass的word

家园 关于这个问题我觉得有必要讨论一下

原则上,我也赞同这点:

语言文字已经被污染了,大家都有义务纠正过来,你既然说这个话题,就应该规范用词,这是许多有识之士曾经在西西河呼吁过的。

但是,既然大家对这个问题这么关心,那么我觉得还是要详细说一下我对这个问题的理解。

先抛开“密码”这个有争议的词不论,先说一下其它的一些和密码/密码学相关的术语:

口令:Password。这个含义很清晰,无需多解释。

密码学:Cryptography。指的是对密码算法的研究和使用。如果要细分,偏向于密码技术的使用,密码协议和安全系统的设计等。而对密码算法本身的研究和设计,还有另一个词Cryptology指代。但是如果不需要精确细分的话,一般二者通用。

密码算法:Cipher。一般是加密算法和解密算法的通称。

密钥/密匙/钥匙,Key,密码学上密码算法中的某些关键参量。

而1001n说的,如果说是他写的《密码传奇》,那么实际上他说的是密码学和密码学发展史(说实话我看的不是很多,断断续续看了大约10篇左右吧)。而且细分而言,可能也是考虑到读者的水平,在近现代密码学中,除了对enigma分析的一小段外,其余的大都是密码技术和密码协议上的叙述和描写。例如说描述分析破解enigma中,大量描述到对德军密电前几个字符是密钥及盟军以此为突破口等,这就是密码协议和密码分析的范畴。而描述到德军使用enigma传输天气预报而导致破解的时候,这些就属于德军的安全系统的设计失误等等。

同理,前面另一位朋友所说的《暗算》,也是密码学上的内容,而且监听(第一部)和密写术(第三部)等等,已经不是传统的密码学范畴了。

当然,有一点我想我们可以有共识的,就是“密码”一词,如果从广义而论,基本上包括了我上面所说的各种范畴。而现在我们所争议的就是,狭义上的“密码”所指,究竟是指代“密码学”?“密码算法”?还是“口令”?

在这点上,我承认汉语确实有含糊不清的一面。

但是我个人认为“密码”和“密码学”不是同一个指代对象。原因有以下几个:

一:在我能找到的所有翻译软件中,对Password一词,翻译的结果中,要么“口令”和“密码”并存,要么只出现“密码”,而不出现“口令”。反过来只出现“口令”而不出现“密码”的,目前我没有看到。而对Cryptography一词的翻译,均称为“密码学”。

二:wikipedia中,在“密码”词条中,明确写到:

密码在中文里是“口令”(password)的通称。登录网站、电子邮箱和银行取款时输入的“密码”其实严格来讲应该仅被称作“口令”,因为它不是本来意义上的“加密代码”,但是也可以称为秘密的号码。

而在“密码学”词条和“密码”的词条入口完全不同。这至少意味着“密码学”和“密码”是两个完全不同的词语(不像“物理学”和“物理”一样二者等价)。

但是我个人对把“密码”解释为“加密的代码”,有异议。因为很简单:“代码”一词是计算机中的专有名词,和“源代码”一词基本上等价。而“密码”的使用范围广得多,总不能说只有在计算机或者IT上的,才能叫做“密码”吧?

而我认为“密码”指代“口令”的原因是:现有大量的技术文档、软件界面、用户手册等等,都以“密码”代称“口令”,包括在我工作中接触到的大量涉及系统安全方向的专业技术文档,都以此代称。

另外,这种代称也在各方面被使用着:从银行ATM上的提示、银行柜台输入密码的语音提示、电子邮箱的登录(例如说我用的Gmail)还有网站(例如说西西河)都是如此--虽然大家都说严格意义上应当被称为“口令”。如果大家都有共识认为“密码”不能指代“口令”,那么首先应该让铁老大把西西河的登录界面给改了再说。

所以,起码在我的文章描述的范畴中,可以认为,这种取代是被广泛接受的。而且,更进一步来说,我们应当尊重我们所描述的原文。如果明天有人来问我:“你的文章很好,我按照你的方式,去银行柜台设置了新的口令,但是我去商店刷卡或者去ATM取款的时候,人家还是要问我密码,没问我口令,怎么办?”不要以为“Press any key to continue”这种笑话仅仅是笑话。

但是,如果说“密码”一词指代“密码算法”,也是有先例可寻的:例如说著名的凯撒密码,实际上指的是一种密码算法,不过这一般指的是古代的密码算法。到了现代的密码算法,一般重新称为算法了。例如说“DES算法”、“RSA算法”、“RC4/5算法”、“IDEA算法”等等。

至于有人用“对称密码”这种说法,反倒是不正确的。因为英文的描述为:symmetric-key algorithm。algorithm一词明显应当被翻译为“算法”。

或者从另一个角度,也可以认为“密码”是“密码算法”的简称,也行。

实际上,这种多重替代,或者用俗称来替代,是非常常见的。在不引起歧义的情况下,对大多数人都接受的替代称呼,不应该过多的干涉。

例如说,Linux这个词,指的是什么?一个操作系统?一类操作系统?一系列发行版的集合?错!

从严格定义来说,Linux仅仅指的是一个十来兆二十兆字节的程序,虽然通常我们称之为:内核,但是实际上,这个“内核”,才是真真正正严格定义上的Linux。但是,在绝大多数情况下,包括各种的软硬件驱动、shell都被通称为Linux。范围大一点的,连grub、Xwindow和各种的窗口管理器都会包括在内。

另外,Linux的严格称呼,应当为GNU/Linux。先不论法律上怎么说,但是单独称为Linux,在绝大多数情况下,也是约定俗成的。

至于Linux这个单词的发音,说实话,我听到的版本至少有三四个,不过没关系,大家知道说的是什么就可以了。

所以,我个人的看法如下:

一,“密码”这个词本身没有严格的学术定义,或者说我没有看到在学术界对此有共识或者有通用的定义(如果有的话,请各位提出相关的证据);

二,狭义上的“密码”一词,不应该指代为“密码学”;

三,“密码”同时指代“口令”和“密码算法”是不会引起歧义的,因为这二者同时在同一场合出现的可能性很小,而且,在专业技术文档中,“密码算法”一词通常是被明确指出的;

四,作为通用的约定俗成的称呼,“密码”指代“口令”一词,已经在绝大多数场合被使用,而且甚至可以看到“口令”一词本身已经很难看到。所以,从语言的角度来说,已经不是“指代”的关系,而是“替代”的关系了;

五,一词多义的情况,无论在中文还是英文,都非常常见(英文单词的Key,有多少种含义?)。只要没有明确的定义或者约定的共识,而且不引起歧义,直接使用较常见的称呼,并无不可。

最后,说说我对这个问题的感受,就是我似乎在不断的向几位在解释:为什么1+1=2?

因为在IT界,大量的中文技术术语,根本就没有统一的翻译标准。而实际使用中,为了表达准确,常常会直接使用英文原文。所以,抬杠一点说,很多时候,根本就无所谓“污染”一说--因为从来就没干净过。例如说最著名的“堆”、“栈”和“堆栈”的翻译,谁污染谁了?还能被怎么污染吗?

所以对于开头的那句话,我原则上同意。例如说“鲸鱼”不是鱼,要改为“鲸”这种,我同意。如果想把这个原则和模式套在IT界,不可能行得通。老实说,我比你们更盼望有个国家统一的术语翻译标准出来。在这个标准出来之前,我的唯一目的是让我的同事、老板、客户、读者明白。中文不够,搭上英文。


本帖一共被 3 帖 引用 (帖内工具实现)
全看树展主题 · 分页首页 上页
/ 3
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河