Etherpad-lite: SQL ์ธ์ ์…˜ ์‹œ๋„๋กœ Etherpad ๋ผ์ดํŠธ ์ข…๋ฃŒ

์— ๋งŒ๋“  2018๋…„ 10์›” 23์ผ  ยท  13์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ether/etherpad-lite

์•ˆ๋…•ํ•˜์„ธ์š”,

์šฐ๋ฆฌ ์„œ๋ฒ„์—์„œ Etherpad๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ถˆ์พŒํ•œ ์ฟผ๋ฆฌ์— ์˜์กดํ–ˆ์Šต๋‹ˆ๋‹ค.

https://pad.bling.org/javascripts/lib/ep_etherpad-lite/static/js/pad.js?callback=require.define&vLtF%3D6904%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2CNULL%2C%27%3Cscript%3Ealert%28%22XSS%22%29%3C%2Fscript%3E%27%2Ctable_name%20FROM%20information_schema.tables%20WHERE%202%3E1--%2F%2A%2A%2F%3B%20EXEC%20xp_cmdshell%28%27cat%20..%2F..%2F..%2Fetc%2Fpasswd%27%29%23

"์ตœ์†Œํ•œ์˜" ์ฟผ๋ฆฌ ์˜ˆ:

https://pad.bling.org/javascripts/lib/ep_etherpad-lite/static/js/pad.js?callback=require.define&vLtF%3D6904%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2CNULL%2C%27%3Cscript%3Ealert(%22XSS%22)%3C%2Fscript%3E%27

์ด๊ฒƒ์€ ์ฆ‰๊ฐ์ ์ธ ์ถฉ๋Œ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

oct. 23 18:17:19 pad.bling.org run.sh[8976]: [2018-10-23 18:17:19.994] [ERROR] console - Error: ENAMETOOLONG: name too long, open '/var/www/etherpad-lite/var/minified_L2phdmFzY3JpcHRzL2xpYi9lcF9ldGhlcn
oct. 23 18:17:19 pad.bling.org run.sh[8976]:     at Error (native)
oct. 23 18:17:19 pad.bling.org run.sh[8976]: [2018-10-23 18:17:19.995] [INFO] console - graceful shutdown...
oct. 23 18:17:20 pad.bling.org run.sh[8976]: [2018-10-23 18:17:20.091] [INFO] console - db sucessfully closed.

๋…ธ๋“œ v6.14.4๊ฐ€ ์žˆ๋Š” Debian Stretch์—์„œ 1.7.0 ํ”Œ๋ ˆ์ด๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํŠน์ • ์‚ฌ์šฉ์ž ์ง€์ •์€ ์—†์Šต๋‹ˆ๋‹ค.
๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ Etherpad ์„ค์น˜์—์„œ ๋™์ž‘์„ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Serious Bug security

๋ชจ๋“  13 ๋Œ“๊ธ€

์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.
์†Œ์ค‘ํ•œ ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @fpoulain , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์—ฌ๋Ÿฌ๋ถ„, ์ฑ…์ž„ ์žˆ๋Š” ๊ณต๊ฐœ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์ž…๋‹ˆ๋‹ค. ์„ ํƒํ•  ๊ธฐํšŒ๋ฅผ ์ฃผ์ง€ ์•Š๊ณ  ๊ณต๊ฐœ์ ์œผ๋กœ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์ฑ…์ž„ ์žˆ๋Š” ๊ณต๊ฐœ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์ž…๋‹ˆ๋‹ค. ์„ ํƒํ•  ๊ธฐํšŒ๋ฅผ ์ฃผ์ง€ ์•Š๊ณ  ๊ณต๊ฐœ์ ์œผ๋กœ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ  ... ์‹ค์ œ๋กœ ์ผ๋ถ€ ๋ชป๋œ ๋†ˆ๋“ค์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋น„๊ณต๊ฐœ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹ ๊ณ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์„ค๋ช…์—๋Š” ๋ณด์•ˆ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋น„๊ณต๊ฐœ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๊ฐ€ ์–ธ๊ธ‰๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹ ๊ณ ํ–ˆ์„ ๊ฒƒ ๊ฐ™์•„?

Afaik ์šฐ๋ฆฌ๋Š” ์ฑ…์ž„ ์žˆ๋Š” ๊ณต๊ฐœ ์ •์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด etherpad.org์™€ github readme์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.


๋ณด๋‚ธ ์‚ฌ๋žŒ: Franรงois Poulain [email protected]
๋ณด๋‚ธ ๋‚ ์งœ: 2019๋…„ 1์›” 21์ผ ์›”์š”์ผ ์˜ค์ „ 11์‹œ 16๋ถ„
๋ฐ›๋Š” ์‚ฌ๋žŒ: ether/etherpad-lite
์ฐธ์กฐ: John McLear; ๋…ผํ‰
์ œ๋ชฉ: Re: [ether/etherpad-lite] SQL ์ฃผ์ž… ์‹œ๋„๊ฐ€ Etherpad ๋ผ์ดํŠธ๋ฅผ ์ฃฝ์ž…๋‹ˆ๋‹ค(#3502).

์—ฌ๋Ÿฌ๋ถ„, ์ฑ…์ž„ ์žˆ๋Š” ๊ณต๊ฐœ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์ž…๋‹ˆ๋‹ค. ์„ ํƒํ•  ๊ธฐํšŒ๋ฅผ ์ฃผ์ง€ ์•Š๊ณ  ๊ณต๊ฐœ์ ์œผ๋กœ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ  ... ์‹ค์ œ๋กœ ์ผ๋ถ€ ๋ชป๋œ ๋†ˆ๋“ค์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋น„๊ณต๊ฐœ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹ ๊ณ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์„ค๋ช…์—๋Š” ๋ณด์•ˆ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋น„๊ณต๊ฐœ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๊ฐ€ ์–ธ๊ธ‰๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹ ๊ณ ํ–ˆ์„ ๊ฒƒ ๊ฐ™์•„?

-
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub https://github.com/ether/etherpad-lite/issues/3502#issuecomment-456039980 ์—์„œ ํ™•์ธํ•˜๊ฑฐ๋‚˜ https://github.com/notifications/unsubscribe-auth/ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐ

"๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ...๋ฅผ ํ†ตํ•ด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค."๋ผ๋Š” ์ดˆ๋Œ€์žฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ํ˜ธ๋ฅผ ์—ด๊ธฐ ์ „์— github์˜ readme์™€ etherpad.org์—์„œ ๊ทธ๋Ÿฐ ์ดˆ๋Œ€์žฅ์„ ์ฐพ์ง€ ๋ชปํ•œ ์ฑ„ ๋ช‡ ๋ถ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์˜์–ด๊ฐ€ ๋ชจ๊ตญ์–ด๊ฐ€ ์•„๋‹Œ ๋…์ž๋กœ์„œ ๋‚˜๋Š” ์ฐพ์•„์•ผ ํ•  ์ข‹์€ ์กฐ๊ฑด์„ ๋†“์น  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์œ ๋ช…ํ•œ. Tnx


๋ณด๋‚ธ ์‚ฌ๋žŒ: Franรงois Poulain [email protected]
๋ณด๋ƒ„: 2019๋…„ 1์›” 21์ผ ์›”์š”์ผ ์˜คํ›„ 2์‹œ 35๋ถ„
๋ฐ›๋Š” ์‚ฌ๋žŒ: ether/etherpad-lite
์ฐธ์กฐ: John McLear; ๋…ผํ‰
์ œ๋ชฉ: Re: [ether/etherpad-lite] SQL ์ฃผ์ž… ์‹œ๋„๊ฐ€ Etherpad ๋ผ์ดํŠธ๋ฅผ ์ฃฝ์ž…๋‹ˆ๋‹ค(#3502).

"๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ...๋ฅผ ํ†ตํ•ด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค."๋ผ๋Š” ์ดˆ๋Œ€์žฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ํ˜ธ๋ฅผ ์—ด๊ธฐ ์ „์— github์™€ etherpad.org์—์„œ ๊ทธ๋Ÿฐ ์ดˆ๋Œ€์žฅ์„ ์ฐพ์ง€ ๋ชปํ•œ ์ฑ„ ๋ช‡ ๋ถ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์˜์–ด๊ฐ€ ๋ชจ๊ตญ์–ด๊ฐ€ ์•„๋‹Œ ๋…์ž๋กœ์„œ ๋‚˜๋Š” ์ฐพ์•„์•ผ ํ•  ์ข‹์€ ์กฐ๊ฑด์„ ๋†“์น  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

-
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ํšŒ์‹ ํ•˜๊ฑฐ๋‚˜ GitHub https://github.com/ether/etherpad-lite/issues/3502#issuecomment-456096384 ์—์„œ ํ™•์ธํ•˜๊ฑฐ๋‚˜ https://github.com/notifications/unsubscribe-auth/ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐ

์ €๋„ ๋ชป ์ฐพ์•˜์ง€๋งŒ https://github.com/ether/etherpad-lite/issues/2499 ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์š”์ฒญํ•˜์‹  ๊ฒƒ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค

๋น ๋ฅธ ์ˆ˜์ •์œผ๋กœ https://securitytxt.org/ ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/ether/yajsml/blob/master/server.js#L98

๋ฉด์ฑ… ์กฐํ•ญ: ์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋งŒํผ ๋˜‘๋˜‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„์™€์ค„ ์ „๋ฌธ ์ง€์‹์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

์ด๋ด! ์ง€๊ธˆ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์กฐ์‚ฌ ์ค‘์ž…๋‹ˆ๋‹ค.

๋จผ์ €: SQLi์— ๋Œ€ํ•œ ๋‘๋ ค์›€์„ ์—†์• ๊ธฐ ์œ„ํ•ด: ๋™์ผํ•œ ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ์ด ๋Œ€์ฒด ํŽ˜์ด๋กœ๋“œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด๊ฒƒ์€ SQL ์ฃผ์ž…๊ณผ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

/javascripts/lib/ep_etherpad-lite/static/js/pad.js?callback=require.define&footlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootle

์ด๊ฒƒ์€ ์บ์‹ฑ ๋ฏธ๋“ค์›จ์–ด์˜ ํŒŒ์ผ ์ด๋ฆ„ ๊ธธ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์บ์‹œ ํ‚ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

var cacheKey = Buffer.from(path).toString('base64').replace(/[/+=]/g, '');

์ด๋กœ ์ธํ•ด ์บ์‹œ ํ‚ค ๊ธธ์ด๊ฐ€ ๊ฒฝ๋กœ ๊ธธ์ด๋กœ ์ œ์–ด๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งŽ์€ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ํŒŒ์ผ ์ด๋ฆ„ ๊ธธ์ด๋ฅผ 255์ž๋กœ ์ œํ•œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ ํ‚ค๊ฐ€ ๋””์Šคํฌ์˜ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋  ๋•Œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋กœ๊ทธ์— ENAMETOOLONG ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฒ„์ „ ๋Œ€์‹  ์บ์‹œ ํ‚ค๋ฅผ ๊ฒฝ๋กœ์˜ ํ•ด์‹œ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ณ ์ • ๊ธธ์ด ํŒŒ์ผ ์ด๋ฆ„์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

๊ณง์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” PR์„ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, @tomnomnom ์ž…๋‹ˆ๋‹ค. ์บ์‹œ ํ‚ค์˜ ๊ธธ์ด๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ์ด์น˜์— ๋งž์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์ถฉ๋Œ ์œ„ํ—˜์ด ๊ฑฐ์˜ ์—†๋Š” ์ƒํƒœ์—์„œ ์ฝ˜ํ…์ธ ์— ๊ณ„์† ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋ฐค์— ๋ด์•ผ๊ฒ ๋‹ค.
์ž˜ ํ–ˆ์–ด์š”!

PR์„ ๋ณ‘ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ฐธ๊ณ  ์‚ฌํ•ญ: nodejs ๋ฌธ์„œ ์—์„œ crypto ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค .

์•”ํ˜ธํ™” ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ง€์›์„ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  Node.js๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ require('crypto')๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ž„๋ฒ ๋””๋“œ ํ”Œ๋žซํผ์— ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ARM, MIPS, Raspberry PI ๋“ฑ)? ๋ชจ๋ฅด๊ฒ ์–ด์š”. ์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

  • ๋ฆฌ์†Œ์Šค ๋˜๋Š” ๋ณด์•ˆ์ด ์ œํ•œ๋œ ํ™˜๊ฒฝ์—์„œ ๋น„ํ‘œ์ค€ ๋…ธ๋“œ ์‹คํ–‰(์ด ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๋ช…์‹œ์  ์ง€์›์€ node#5611 ์ฐธ์กฐ)
  • ์—๋ฎฌ๋ ˆ์ดํŠธ๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰(browserify, webpack ๋“ฑ)
  • ์†Œ์Šค์—์„œ ๋…ธ๋“œ ๋นŒ๋“œ ๋ฐ ์ž„์˜์˜ ์ด์œ ๋กœ openssl/crypto ์ƒ๋žต( StackOverflow ์งˆ๋ฌธ ๋˜๋Š” ๋‹ค๋ฅธ nodejs ๊ฒŒ์‹œ๋ฌผ ์ฐธ์กฐ )

์–ด์จŒ๋“ , ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ๋“ค์€์ด ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌ https://github.com/microsoft/TypeScript/issues/19100 , ๊ทธ๋“ค์€์—์„œ ์šฐ์•„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ https://github.com/microsoft/TypeScript/commit/ 9677b0641cc5ba7d8b701b4f892ed7e54ceaee9a.

์•”ํ˜ธํ™” ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ์‹คํŒจํ•˜๋ฉด ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ djb2 โ€‹โ€‹์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•œ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function djb2Hash(data) {
    const chars = data.split("").map(str => str.charCodeAt(0));
    return `${chars.reduce((prev, curr) => ((prev << 5) + prev) + curr, 5381)}`;
}

console.log(Buffer.from(djb2Hash('This is a ๐Ÿ˜Ž test of the djb2 hash function')).toString('hex'));
// prints 36373536373437333033

๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ์ด๊ฒƒ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์ง€๋งŒ djb2 ์ด์•ผ๊ธฐ๋Š” ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ Daniel Bernstein ์ด 1991๋…„์— ์ž‘์„ฑํ•œ ์›๋ž˜ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ๊ฒŒ์‹œ๋ฌผ ์„ ์ฐธ์กฐ ํ•˜์‹ญ์‹œ์˜ค . ๊ทธ๋Š” ๋‹น์‹œ 20์„ธ์˜€์Šต๋‹ˆ๋‹ค .

์•”ํ˜ธํ™” ์ง€์›์ด ์—†์„ ๋•Œ djb2 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ›„์† ์กฐ์น˜: #3797.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰