תרגיל מתמטי של הסתרת מזהה רץ
-
אני מאוכזב קשות מהדרך בה נגשו פה העונים לשאלה.
רובם לא ניסו בכלל לענות על השאלה כפי שהיא נוסחה בבהירות (תרגיל חשבוני פשוט להסתיר ולפענח מספר) רק על הצורך שעלה להם ברפרוף מהכותרת ומקצת הטקסט שנאמר בה, זאת למרות שבשאלה ציינתי שיש לי מושג או שניים איך לעשות את זה כמקובל. כל מחאותיי וויכוחיי לא עזרו...אני הולך לכתוב פה בחוסר התלהבות את הפתרון, שכבר כתבתי עליו בהודעה השניה אבל אז לא הבנתי איך הוא עובד.
ב"ה כעת הבנתי ואני הולך להשתמש בו.להלן המ"מ שעזרו לי:
https://stackoverflow.com/a/8555047
https://ericlippert.com/2013/11/14/a-practical-use-of-multiplicative-inverses/
https://jmcphers.github.io/techniques/2015/08/20/id-obfuscation.htmlאז ככה, מגדירים 3 מספרים קבועים חד פעמית:
א. מספר מקסימום שודאי לא נעבור בשום שלב, למשל אם מדובר בביקורים, נחליט על 10 מליארד.
ב. מספר כל שהוא שניתן לבחור אקראית, שהוא קטן מהמקסימום ושהוא גם מספר זר למספר המקסימום (אפשר פשוט לנסות בכלי בסעיף ג', אם יש תוצאה תקינה אז זה מספר זר).
ג. מוצאים את הModular multiplicative inverse של ב', על ידי כלי כמו זה https://www.dcode.fr/modular-inverse (שמים את המספר של ב', ובמודלו שמים את המקסימום מא').אחרי שיש לנו את שלושת המספרים הללו, נקרא להם בשמות MAX, A, B.
בשביל להסתיר את המספר פשוט נביא את השארית של חלוקת הA * המספר, בMAX:mask = number * A % MAX;
בשביל לפענח נעשה משהו דומה:
original = mask * B % MAX;
המחשה של הפעולה:
https://replit.com/@davidlevtov/EnormousJoyousDesign#index.jsהקידוד וגם הפיענוח נעשים ע"י שני פעולות אריתמטיות פשוטות.
ולמי שיש חלום לנוסחה שמתקרבת לקרסולי קרסוליים של המהירות של זה,
הוא מוזמן לבדוק פה את פתרונו
https://jsben.ch/SA0T6
שמתי בתור "תופס מקום" אלגוריתם שלא עושה כלום אבל משרשר טקסט למספר ובהמרה מחזיר למספר.הערה: במספר ב' גדול (או קלט גדול) יכולה להיות גלישת מספר שתעוות את התוצאות, עליכם להבטיח שהמקסימום לא יחרוג על ידי מספרים נמוכים או טיפוסי מספרים גדולים (long או BigInt וכדומה).
-
@dovid אמר בתרגיל מתמטי של הסתרת מזהה רץ:
המחשה של הפעולה:
https://replit.com/@davidlevtov/example-obfuscating-ids#index.jsאין לך שם טעות?
זה הפלט:{ aNumber: 747346087, bNumber: 453920023 } [ 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314 ] [ 203826100, 951172187, 698518274, 445864361, 193210448, 940556535, 687902622, 435248709, 182594796, 929940883, 677286970, 424633057, 171979144, 919325231, 666671318 ] [ 304, 320, 320, 288, 304, 320, 320, 320, 304, 320, 320, 320, 320, 320, 320 ]
המערך השלישי לא אמור להיות שווה לראשון?
-
@צדיק-תמים אמר בתרגיל מתמטי של הסתרת מזהה רץ:
@dovid אמר בתרגיל מתמטי של הסתרת מזהה רץ:
הבעיה היא בגלל ההנתהגות של JS כשיש גלישה אריתמטית.
תוכל לפרט יותר? תודה.
בשלב השני, כלומר בפיענוח, המספרים גבוהים מאוד.
הרשימה המוצפנת מכילה למשל באיבר השני את המספר 951172187, אותו מכפילים כפול bNumber שערכו בדוגמה של @WWW הוא 453920023.
951172187*453920023 יוצא באקסל 431756101000000000, אולם בקונסול הוא יוצא 431756101000000300, בגלל שזה גודל מספר שחורג בהרבה מקיבולת הביטים המוקצים לטיפוס הנתונים של מספר בjavascript (שזה 53, לא כולל עוד כמה לסימון שלילי/חיובי וחזקות).
המקסימום המספרי שעובד כצפוי בJS זה הערך בקבוע Number.MAX_SAFE_INTEGER = 9007199254740991 (זה המון...).באמת במקרה הזה די להשתמש בBigInt רק בפיענוח.
-
@dovid אולי אני מבלבל את המוח.
אבל קראתי עכשיו את כל השרשור וניכר שלא ברור ככ לאנשים מה אתה רוצה.
עד כמה שאני הבנתי ממה שכתבת, היית צריך לכתוב כותרת פשוטה של 'אני צריך הצפנה, (סימטרית), אבל מאוד פשוטה וקלה על המעבד'.אני לא מבין בהצפנות כלל, לכן אין לי מה לתרום לנושא (אני יודע לעשות גוגל כנראה כמוך, ואם זה היה הנושא כנראה תגיע לתוצאות טובות יותר ממני)..
בנוגע לצורך עצמו - חשיפת id רץ מטבלה בדטבייס לקליינט - הייתי פשוט משתמש בטבלת הביקורים בשדה uuid אוטומטי (לא יודע באיזה DB אתה משתמש ועד כמה זה זמין שם, אבל משער שאתה תסתדר..) ופשוט שולח את ה-uuid לקליינט.
מה רע בזה? -
@chv אמר בתרגיל מתמטי של הסתרת מזהה רץ:
'אני צריך הצפנה, (סימטרית), אבל מאוד פשוטה וקלה על המעבד'
הסיבה שכותרת כזו לא מתאימה לי:
א. יש משמעות גדולה לכך שמדובר במספרים בלבד, וגם שיש ידע השערתי שישנו רצף.
ב. אני לא רוצה רמה של הצפנה, סה"כ הסתרה. שיצטרכו מחקר עמוק במיוחד להשיג את הנתון.
ג. גם הצפנה של AES היא יחסית קלה מאוד למעבד מודרני. אני ביקשתי שהמשמעות תהיה אפסית. רק להמחשה, פעולה חשבונית כפי מה שמצאתי כבר (ופירטתי על כך בהודעות לעיל) היא ככל הנראה פחות מעשירית ואולי מאית האחוז כנראה מכלל הפעולות של בקשה ותשובה בודדים בexpress...עריכה: הכותרת המקורית שלי גם מאוד מביאה לידי ביטוי דילמה פשוטה שאני מניח (אולי בטעות) שכל מפתח ווב ואפילו מפתחים אחרים אמורים להתחבט בה הרבה. לי אישית זה מציק תקופה ארוכה עד שהחלטתי לשאול פה ולחפש ככל יכולתי.
-
@dovid אמר בתרגיל מתמטי של הסתרת מזהה רץ:
קראת טוב טוב את השאלה?
כן, כמובן.
הייתי צריך להשקיע קצת, אני חייב להודות, כי זה לא היה ברור בכלל. והסתבך עוד יותר בהמשך השרשור.פעולה חשבונית כפי מה שמצאתי כבר (החמצת את החלק הזה)
לא החמצתי כלל.
זו פשוט צורה של הצפנה מסוימת. זה מה שזה (תקרא לזה 'הסתרה' או איך שאתה רוצה. 'הצפנה' זו הסתרה של מידע מסוים כך שיהיה ניתן לפענח בפרוצדורה נפרדת).אני חוזר שוב על מה שכתבתי:
יש לך צורך (העברה של מזהה רץ לקליינט בלי שהקליינט יוכל לדעת באמת את היחסיות של המזהה הרץ בתוך הטבלה הכללית שלו).
אתה החלטת על דרך פתרון (העברת המזהה הרץ) ולכן אתה צריך עטיפה לפיתרון שלך כדי לא לחשוף דרכו את המזהה הרץ בצורתו המקורית.כמובן שמדובר על הצפנה מסוג כלשהו, ואתה כותב זאת בעצמך. אני כתבתי שאני לא מבין בזה ואין עניין שאכתוב משהו בנושא.
הצעתי דרך פתרון שונה לצורך שלך, כך שלא תסתמך על מזהה רץ אלא על uuid ("מזהה גלובלי"??). לא יודע אם זה מתאים לך, אם יש לזה עלויות נוספות. לא יודע. הצעתי.זה נשמע קצת כמו מתקפה - כי כל השרשור הזה מרגיש כמו קרב אחד גדול
לא יודע בדיוק למה זה מגיע לזה
-
@chv ההצעה שלך של UUID מוזכר בפרוש בשאלה
@dovid אמר בתרגיל מתמטי של הסתרת מזהה רץ:
אז יש לי כמובן את האפשרויות הקלאסיות: מזהה גלובלי במקום מספר רץ, או מזהה גלובלי במקביל למספר הרץ שגם יאוחסן בכל שורה ולפי זה אוכל לשלוף את השורה הנכונה. ויש אפשרות של ערפול ע"י הצפנה אפילו חלשה של המזהה.
אאל"ט, מזהה גלובלי הכוונה UUID
-
@chv אמר בתרגיל מתמטי של הסתרת מזהה רץ:
זה נשמע קצת כמו מתקפה - כי כל השרשור הזה מרגיש כמו קרב אחד גדול
הדבר היחיד שאני מסכים איתו בכל השרשור הזה.
(לא להתקיף... אני פשוט עדיין לא מבין במעבדים וזכרונות וביצועים וכו וכו', ולכן אני מעדיף שלא להביע דעה בנושאים שאין לי בהם שמץ הבנה, אולי... אולי עוד יהיה לי חופש.. איזה בין הזמנים כזה... כדי ללמוד עוד משהו) -
@dovid אמר בתרגיל מתמטי של הסתרת מזהה רץ:
למשל הרעיון של הXOR אני לא יודע לפענח, אבל אני בטוח שהוא קל לפענוח.
פיענוח XOR נעשה על ידי פעולה נוספת של XOR.
לוקחים את המספר המקורי והמספר המוצפן, עושים תרגיל XOR על שניהם והתוצאה היא מספר ה'מפתח'.
-
@קומפיונט ידעתי גם ידעתי... השתמשתי בXOR לפני 16 שנה כבר...
כוונתי הייתה לפענח מתוך הרצף ללא המפתח. מה שכתבתי מקודם
(אולי הייתי צריך לכתוב לפרוץ, סליחה)@dovid אמר בתרגיל מתמטי של הסתרת מזהה רץ:
ג. לגבי XOR אני מייד חשבתי עליו, אבל בבדיקה שערכתי שמתי לב שאם אני מבקר ביקורים עוקבים המספרים גם הם עוקבים במידה רבה. אני די משוכנע שזה מאפשר לפורץ למצוא את המפתח בקלות, אם מישהו יודע שאני טועה אשמח כי זה הכי קל.
הנה XOR למספרים עוקבים על מספר רנדומלי:
159866
159865
159864
159871
159870
159869
159868
159859
159858
159857כיון שקל לראות איך נראה כל אחד מהמספרים האלה בינארית, מסתבר שקל לראות מה השתנה בהם ולהסיק מזה איזה סיביות יש במפתח ומה המספר.
-
@dovid אמר בתרגיל מתמטי של הסתרת מזהה רץ:
יש לך עצה קונקרטית עבורי או עבור מישהו אחר איך למנוע את זה להבא?
או שאתה רק מצהיר הצהרה רבת תועלת.ראשית, אני לא מתכוון לא אליך באופן ספציפי ולא לאדם אחר בדווקא.
אבל אני חושב שחכמינו ז"ל ידעו והצהירו "דברי חכמים בנחת נשמעים".
נכון, לא כתוב שם "נכתבים" אבל אפשר לנסות לקחת את הרעיון גם אל הכתב.כשאני מגיע לכזה שרשור אני נזכר בעצמי, כשאני לא מבין או יודע בדבר מסויים, אבל רק חשבתי שהבנתי את התשובה, או טעיתי בהגדרת השאלה והייתי בטוח שאני כן מבין בזה, הייתי מצפה לתגובה ברוח טובה.
זה באמת מרגיז כשהעונה לא ירד לסוף דעתך או שחשב להחכים אותי במה שכבר ידעתי ולא שאלתי... וגם השואל לפעמים מרגיש שאולי נראה שלא למד מילה או שנים בתחום מסוים וכבר שואל עליה, ובכל זאת הרבה דרכים לתגובה...
(ושלא תחשוב שאני מדבר רק על אחרים, אני זוכר את עצמי לפעמים שגם עונה ככה, אבל כשאני רואה אותי במראה - זו צביטה, מותר וצריך להשתנות)
סליחה על סטיה מהנושא (פשוט ביקשת... )
א גוטען ערב שבת! -