תרגיל מתמטי של הסתרת מזהה רץ
-
@dovid
חשבתי קצת לפני שכתבתי את ההצעה שלי
ואכן לא חשבתי על כך שתוקף יוכל לשלוח 30 בקשות ברצף ולראות את המספרים שחוזרים על עצמם.
בכל אופן אני לא מוצא חיסרון בהוספת מספרים רנדומליים + מספר מסויים שמסמן הזחה, גם במאמץ קיצוני איך התוקף יבין שהמספר הרביעי (שגם הוא רנדומלי) מסמן הזחה לכל המספרים האחרים, אם הוא מריץ נוסחאות מורכבות לגלות את זה נראה לי שהכי פשוט להשתמש בהצפנה מוכרת ולא להמציא את הגלגל.
עריכה: לא חושב ששליפה ממערך זה כל כך הרבה פעולות מעבד. -
@nigun ראית את ההודעה השני שלי פה בנושא? ראית את התרגיל שיש שמה? אתה לא מבין שאני שואף למשהו כ"כ כיף שכזה?
בקשר לרעיון שלך כתבתי מפורש שהוא יפה. הוא לא הפתיע אותי כי הוא מוכר לי, צפנים אמיתיים בעבר הסתמכו על רעיונות כאלו. אין לי מושג איך מפענחים אותם אבל מפענחים אותם בקלי קלות. למשל הרעיון של הXOR אני לא יודע לפענח, אבל אני בטוח שהוא קל לפענוח.
אתה אומר שעדיף להשתמש בהצפנה ולא להמציא את הגלגל, אני מסכים לגמרי! רק ש:
א. להשתמש בהצפנה במקרה שלי זה רע. זה עבודה למחשב על לא דבר, כדאי לו כבר לשלוף מהמסד רק במקרה תרומה (זה מה שכעת אני עושה) מאשר להצפין בשלוש מאות ביקורי סרק של בוטים.
ב. אני לא רציתי להמציא את הגלגל, אני הייתי בטוח שיש דרך מסודרת למה שאני מבקש, ואני עדיין בטוח. ולכן שאלתי אולי מישהו פה מכיר, אבל אתה ברוחת להצפנות דומות ופחות יעילות מהסוגים שכתבתי עליהם מפורש בשאלה. -
@dovid אמר בתרגיל מתמטי של הסתרת מזהה רץ:
תוסיף 14 ותחלק לחמש ותוסיף את השארית
ברגע שהוספת את השארית, זה לא הפיך.
לאחר מחשבה, הגעתי למסקנה כזו.
כל עוד זה כפל, חילוק, חיבור, חיסור, הרווח בין מספרים תמיד ישאר שווה פחות או יותר.
בחזקה זה לא.
זה הכי פשוט שיש.
אתה מעמיד כל מספר בחזקת 5 (לדוגמא כמובן. המספר צריך להישאר שמור אצלך). וזהו. אין יחס בין המספרים. -
@Men770 אמר בתרגיל מתמטי של הסתרת מזהה רץ:
לאחר מחשבה, הגעתי למסקנה כזו.
כל עוד זה כפל, חילוק, חיבור, חיסור, הרווח בין מספרים תמיד ישאר שווה פחות או יותר.
בחזקה זה לא.
זה הכי פשוט שיש.
אתה מעמיד כל מספר בחזקת 5 (לדוגמא כמובן. המספר צריך להישאר שמור אצלך). וזהו. אין יחס בין המספרים.מוסיף עוד נקודה - אפשר להוסיף עירפול על זה לפי שניות + תאריך. לדוגמא כל שניה ביום יהיה לה מספר רנדומלי (ולמקילים - מספר הקשור לספרה/דקה/שעה שלה כדי למהר את החישוב) שיוכפל / יחוסר / יחובר בו, עם עוד חישוב הקשור למספר התאריך.
ההקשר יהיה קשה מאוד לפענוח גם אחרי הרבה כניסות.
האם עדיין יש לנו עניין לנסות לפרט יותר ולערוך חישוב לדוגמה, או שעיקר האתגר כבר נפתר?
- נ.ב. אני מכיר מתכנת שעשה קוד לכניסה עבור תוכנה בתשלום - כל נסיון כניסה התוכנה מביאה קוד מספרי ארוך ומצפה לקוד חוזר. והקוד החוזר הוא תוצאה של חישוב מסובך בקוד הראשון.
-
אני מאוכזב קשות מהדרך בה נגשו פה העונים לשאלה.
רובם לא ניסו בכלל לענות על השאלה כפי שהיא נוסחה בבהירות (תרגיל חשבוני פשוט להסתיר ולפענח מספר) רק על הצורך שעלה להם ברפרוף מהכותרת ומקצת הטקסט שנאמר בה, זאת למרות שבשאלה ציינתי שיש לי מושג או שניים איך לעשות את זה כמקובל. כל מחאותיי וויכוחיי לא עזרו...אני הולך לכתוב פה בחוסר התלהבות את הפתרון, שכבר כתבתי עליו בהודעה השניה אבל אז לא הבנתי איך הוא עובד.
ב"ה כעת הבנתי ואני הולך להשתמש בו.להלן המ"מ שעזרו לי:
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כיון שקל לראות איך נראה כל אחד מהמספרים האלה בינארית, מסתבר שקל לראות מה השתנה בהם ולהסיק מזה איזה סיביות יש במפתח ומה המספר.