Dize Sırrını (Açık) Kaynak Kodunda Tutmak


50

Android için bir uygulama geliştirmeyi bitirdim ve GPL ile yayınlamayı düşünüyorum - açık kaynak olmasını istiyorum. Ancak, uygulamanın niteliği (bir oyun) bilmeceler sorar ve cevapları sicim kaynağına kodludur. Cevapları yayınlayamıyorum! Şifreleri güvenli bir şekilde saklamam gerektiği söylendi - ama uygun bir şey bulamadım.

Kaynak kodumu gizlenmiş, şifrelenmiş veya gizlenmiş başka bir dizeyle yayınlamak mümkün mü? Belki bir online veritabanından cevapları okuyarak?

Güncelleme

Yuval Filmus'un aşağıdaki çözümü işe yaradı. İlk okuduğumda nasıl yapacağımdan hala emin değildim. İkinci seçenek için bazı çözümler buldum: karma çözümün kaynağa kaydedilmesi ve kullanıcının her tahmininde karma hesaplaması. Javascript'te bunu yapmak için http://code.google.com/p/crypto-js/ adresinde crypto-js kütüphanesi bulunur . Android için, MessageDigest işlevini kullanın . Denilen (fdroid / github üzerinde) bir uygulama yoktur HashPass bunu yapar.


11
Bunun burada ne kadar ontopik olduğunu merak ediyorum; Her halükarda Bilgi Güvenliği için daha uygun olabilir .
Raphael

2
@YuvalFilmus "Sıcak Soru" oylarıyla kanmayın. Ama nokta alındı.
Raphael

4
Burada eksik olan önemli detaylar: Sadece kullanıcı cevaplarını doğrulamak mı, yoksa doğru cevabı da basmak mı istiyorsun? Ve herhangi bir aksata ihtiyacınız var mı ya da sadece net bir sınırlı sayıda doğru cevap var mı (bu yüzden kullanıcı cevaplarını bu sete karşı tek tek kontrol edebilirsiniz)?
hyde

4
Tüm cevaplar sorunu çözmek istediğinizi soruyor. Neden cevapları yayınlayamıyorsun?
Rhymoid

1
Kodunuzun bu dizelerle ne yapması gerekiyor? Onları çözebilmek için gerekli mi? Yoksa dizeleri bunlarla yeterli şekilde karşılaştırabiliyor muyuz?
David Schwartz

Yanıtlar:


83

Çözmek istediğiniz soruna bağlı olarak en az iki seçeneğiniz vardır.

Kodunuzun masum okuyucularının cevapları istemeden almasını istemiyorsanız ya da en azından biraz zorlaştırmak istiyorsanız, kullanıcıların dikkatini çekmemek için, çözümleri şifreleyip anahtarı kodunuzun bir parçası olarak saklayabilirsiniz; Bazı hesaplamaların sonucu (daha da zorlaştırmak için).

Kullanıcıların cevabı almasını engellemek istiyorsanız, tek yönlü bir işlev veya bilgisayar jargonunda bir karma işlevi kullanabilirsiniz . Cevabın karmasını Mağaza ve onlar cevap o cevabı anlamak mümkün olmadan doğru olup olmadığını test edebilirsiniz hiç önce onu bulmadan. Bu sorunun bir dezavantajı var, bu sorunun cevabına yakın bir cevabı kontrol etmenin daha zor olmasına rağmen, bu sorunun bir çözümü de var.


9
Ekleyeceğim bir şey, daha fazla güvenliğe ihtiyacınız olursa, her bir cevabın muhtemelen farklı bir tuzla tuzlanması gerektiğidir. Bu, bir kerede tüm cevaplara karşı sözlük saldırısını önler. Eğer "gerçek" kripto insanların nasıl yaptığını görmek istiyorsanız, OpenPGP'deki String-to-Key sistemine bir göz atın .
Sahte

1
Karma kodları tutmak, tüm bilgilerin statik ve tuz / başka ne olursa olsun hazır olması anlamına gelir. Sonuç olarak, cevap alanının yeterince büyük olmasının (tam 32-bit tam sayı değerleri gibi), aksi halde (yani çoktan seçmeli sorular durumunda) gökkuşağı tablosunun hızlı bir şekilde doğru cevaplar vereceğine inanıyorum .
Alexei Levenkov

3
Alexei'nin belirttiği gibi, eğer mümkün olan girdileriniz küçük bir alana yayılırsa, cevapları kodda saklamak onları tespit edilen herhangi bir saldırgana açacaktır - ve sanırım çoğu bilmecenin cevaplarının genellikle olması gerektiği gibi, çok küçük durum boşlukları olacağını tahmin ediyorum. ya kelimeler ya da nispeten küçük sayılar. Masum hatalardan kaçınmak için hash veya şifreleyebilirsiniz, ancak birinin gerçekten isteyen bir cevabı almasını engellemek yoktur. (Ayrıca, bilmecesini zaten çözmüş olan birine sorabilirler!)
Chris Hayes

4
Chris'in bahsettiği şeye karşı koymak için, çok yavaş bir karmaşa süreci seçebilir, 100ms sürdüğünü söyleyebilirsiniz (bu, bazı PK standartlarının uyguladığı yaklaşımdır). Bu, kullanıcının bakış açısından hala çok hızlı ancak numaralandırmayı çok daha zorlaştırıyor.
Yuval Filmus,

12
@YuvalFilmus Yine bir ölçüde. Eğer bilmecen sona ererse "Jan, Joe veya Jane suçlu muydu?" o zaman hash tam bir dakika sürse bile numaralandırmak çok kolay olacak. Tüm oyun akılda tutulmadan ve tüm soruların son derece açık uçlu olmadığı sürece, bu bir sorun teşkil edecektir. Sorularınızın Ama eğer evet, vardır durum uzayı yeterince büyük olduğunu açık uçlu olduğu, cevaplar korunabilir.
Chris Hayes,

28

You have iki üç seçenek:

Cevapları kaynak kodun geri kalanından ayrı tutun

Kodunuzun açık kaynak olmasını istiyorsanız, ancak cevapların açık kaynak olmasını istemiyorsanız , soruları ve cevapları olmayan bir uygulama için kaynak kodunu açın , sorular ve cevaplar ayrı bir kapalı kaynak "eklentisi" olur. veya veri dosyası. Android uygulamanız bunların her ikisini de tek bir uygulamada bir araya getirir.

Cevapları kaynak kodunuza koyun

Alternatif olarak, eğer soruları ve cevapları açık kaynaklı istediklerinizin çekirdek bir parçası olarak görürseniz, cevapları kaynak koduna koymalısınız, tercihen başkalarının da okuyabileceği ve değiştirebilmesi için gizliliği kaldırmalısınız . Kaynak kodun anlaşılmasını ve değiştirilmesini engellemek, açık kaynak kod ilkelerine uymuyor.

Cevapları internetteki bir sunucuya koyun

Yukarıdaki çözümlerin her ikisiyle de, her iki durumda da uygulamanızı indiren birisinin, programınızı oynatmadan cevaplarını bulması mümkündür - eğer programınız cevapları başka bilgiler olmadan tanımlayabilirseniz, derlenmiş app inceleyen bir insan olabilir.

Eğer varsa gerçekten kimse cevap bulabiliyorsunuz emin olmak için, daha sonra tek gerçek seçenek olduğunu onlara cevap vermek değil ve onlar cevabını bilmek istediğinizde ... app vb bir web hizmeti çağırmak zorunda. Uygulama, kullanıcının girdiği cevabı göndermeli ve web servisi, uygulamanın cevabın doğru olup olmadığını söylemelidir, bu şekilde kullanıcının cevabın ne olduğunu doğru bir cevaba sahip olana kadar söylemenin hiçbir yolu yoktur (kısa web servisini kaba kuvvetle karşılaştırarak tespit edip bunlara karşı koruyabilirsiniz).

Cevaplarınızı şaşırtmanın yollarını arıyorsanız, bu, bana cevaplarınızı ilk etapta açmak istemeyeceğiniz anlamına gelir, bu yüzden ilk seçenekleri düşünmelisiniz.

E? Er kritik kullanıcı ancak bu sizin engeller az değil çünkü çabaya değer nerede olacağını bir senaryo düşünmeye mücadele ediyorum, sonra üçüncü seçenek tek gerçek seçimdir önceden cevap bulmak mümkün değil uygulamanızı İnternet bağlantısı olmadan kullanma.


8
Sorular ve Cevaplar bir eklenti bile olmak zorunda değildir, basit bir veri dosyası olabilir. Girdi veri dosyalarının lisanslı yazılımın bir parçası olması gerekmez ve kendi ayrı lisansları altında ele alınabilir. Kaynak kodla kullanmak için (farklı) bir örnek veri dosyası sağladığınız sürece, söz konusu kaynaktan derlenen kaynak veya programların ücretsiz kullanımını engellemeyeceksiniz ve bu nedenle GPL'yi ihlal etmemelisiniz.
Doktor J,

Sorunun gerçekten çözüldüğünden emin değilim - cevapların şifreli ve kodlanmış olarak kodlanmış veya ayrı bir dosya olarak dağıtılmış olup olmadığına bakılmaksızın, kodun cevapları şifresini çözebilmesi gerekir; kaynak kodu cevaplara ulaşmak için yapar. (başka bir cevapta önerildiği gibi karma olmadıkça)
Johnny

1
Eğer amaç cevapları kontrol etmekse ve gösterilmelerini gerektirmiyorsa, o zaman tek yönlü bir şifreye sahip şifreler gibi yapılabilir.
JamesRyan

@Justin, cevap verdiğin için teşekkürler ve açık kaynak teşkil edip etmediği konusundaki yorumlarınız ilginç. Cevapları saklamanın kaynak kodunu ya da uygulamanın nasıl çalıştığını gizlemeyi amaçlamadığını, daha ziyade mücadelenin bütünlüğünü korumak olduğunu düşünüyorum. Kriptografi, kullanıcı tahmin edince orada olmak zorunda kalmadan bilmeceleri dağıtmak için harika bir yoldur ('bu mu, bu mu?')
Nevermore

4

Nesne, kaynak kodun sıradan okunmasından sakınmaksa da onları açık tutmak böylece diğer insanların kolayca kendi değişikliklerini yapabilmeleri için - örneğin, kaynağı bir metin macerasına yayınlıyorsanız ve açıklayıcı bir metnin görünmesini istemiyorsanız, bir spoo oluşturacak, sonra rot13 gibi geri dönüşümlü bir şey kullanın.

Aslında, tüm çeviri dosyalarınızı çürütebilir ve onları anında açabilirsiniz.

Bu açık ruhu koruyor. Rastgele "büyü" karmaları, programcı dostu değildir.


4
Aramızdaki birçok GeoCaching milletinin rot13'ü neredeyse orijinal kadar akıcı bir şekilde okuduğunu unutmayın.
yo'

4

Açık kaynak, kaynak kodunun, oyun verilerinin değil, herkese açık ve erişilebilir olmasını gerektirir. Böylece verileri kolayca başka bir dosyaya koyabilir ve onu yayınlayamazsınız. Dosyanın rahat okunmasını önlemek istiyorsanız bir şifreleme ekleyin. Başvurunuz için güçlü bir şifrelemenin gerekli olduğundan şüpheliyim.


1
Oyun verilerini hangi anlamda yayınlayamıyorsunuz? Oyunun bu verilere erişebilmesi için oyunun bir kopyası olan herkesin bir veri kopyası olması gerekir. Bu tam olarak yayıncılıktaki şeydir: halka açık yapmak.
David Richerby

1
@DavidRicherby Neyi yayınlamak istediğinize ve sona ermek istediğinize bağlı. Bu oyun ya da motorunuz benzer oyunların yaratılmasında kullanılabilir mi? İnsanların oyununuzu manipüle etmesine izin verin, güvenlik deliklerinin kodunu inceleyin, yalnızca bileşenleri yeniden kullanın mı? Arabiriminiz "q & a + programlı CSV = oyun" gibi basitse, CSV'yi değil, sadece programı yayınlamanın uygun olacağını düşünüyorum.
Raphael

1
@Raphael Ancak çalıştırılabilir ve düz metin veri dosyasından oluşan bir oyun dağıtmak, cevapları gizli tutma hedefine ulaşamıyor. Veri dosyasının şifrelenmiş bir versiyonunu önermek istiyorsanız, herkes bunun gizlilikle sadece güvenlik olduğunu anladığı sürece, sorun (anahtar kaynağındadır). Ancak, veri dosyasının düz metninin GPL anlamında kaynak kod oluşturup oluşturmadığı sorusuna giriyoruz ve bu noktada soru, bilgisayar bilimi yerine GPL'nin yorumlanması meselesi haline geliyor.
David Richerby

@DidRicherby: Kabul edildi. Yine de, IANAL'a rağmen, bilmecelerden ve cevaplarından oluşan bir veri dosyasının programın ayrı olarak lisanslanamayacak kadar önemli ve yeri doldurulamaz bir parçası olarak değerlendirileceğinden şüpheliyim - özellikle şifreli olmayan bir örnek veri dosyası eklerseniz kaynak dağıtımı, kaynak kodu olan herkesin gerçekten de kendi özelleştirilmiş veri dosyalarını yaratabildiğini ve programda kullanabileceğini açıkça belirtmek için, gerektiğinde değiştirme ve şifreleme talimatlarıyla birlikte.
Ilmari Karonen

4

Kullanıcılarınızın bilmesini istemiyorsanız, neden cevaplarınızı GPL kaynak kodunda saklıyorsunuz? Şimdi bilinmese veya kolayca kırılabilir olsalar bile gelecekte olabilirler (ve muhtemelen olacaklar).

Bunları uygulamanıza kaydetmek yerine, harici bir veritabanı kullanın. Veritabanınızdaki cevapları karşılaştıran küçük bir web hizmeti yapın. Ardından, uygulamanızın doğrulaması gerektiğinde bu web servisine çağrı yapmasına izin verin. Asıl sorun, internet erişimi gerektirdiğinden, bazı hız ve potansiyel kullanıcı tabanını kaybedeceksiniz. Uygulama lisansınız web hizmeti için değil, yalnızca uygulamanın kendisi için geçerli olmalıdır.

Ayrıca cevaplarınızı küçük bir veritabanına koyabilir ve bunu programınıza koyabilirsiniz. Bildiğim kadarıyla, GPL uygulamanızın depoladığı hiçbir veriye değil, yalnızca kaynak koduna uygulanır. Yine de bu konuda yanlış olabilir.


1
"Bildiğim kadarıyla, GPL yalnızca uygulamanızın depoladığı veriler için değil kaynak koduna uygulanır". GPL "Bu lisans altında tüm çalışmayı bir bütün olarak bir kopyasına sahip olan herkese lisanslamanız gerekir" diyor. Bu yüzden şimdi verinin "tüm çalışmanın" bir parçası olup olmadığına karar vermemiz gerektiğini düşünebilirsiniz. Fakat aslında, kesinlikle tüm GPL kısıtlamaları (bunun da dahil olmak üzere) yalnızca lisans sahipleri için geçerlidir. Lisans verenlerin de GPL'nin ruhuna uyması güzeldir, ancak telif hakkı polisini ziyaret etmek için endişelenmeleri gerekmez.
Peter Ford,

1

Bir veritabanını uzak bir web sunucusunda saklasanız bile, veritabanının, görüldüğü gibi tüm doğru anahtar / değer çiftlerini yazarak kopyalanabileceğini unutmayın. Genel olarak konuşursak, mobil uygulamalar ağ vermemesi nedeniyle hata vermemeye veya çalışmamaya çalışmamalı (sıraya alınmış mesajlaşma kullan ve "yapabiliyorken güncelle").

Bu nedenle, yerel bir veritabanı istiyorsanız, ancak kesinlikle şifresi çözülen fikrinden hoşlanmıyorsanız, bir çiçek filtresi kullanabilirsiniz (bir ağla konuşmaktan veya yerel olarak büyük bir şifresi çözülmüş bir veritabanına sahip olmaktan kaçınmak için). Bu, yazım denetleyicilerinin, bellek alanı gergin olduğunda nasıl çalıştığını gösterir.

Yani, aşağıdaki gibi filtreye soru / cevap çiftleri eklerseniz:

Hash (NormalizeString (Soru [n])) + karma (NormalizeString () [n] Yanıt)

"Capitol of Virginia? Richmond" setinde olup olmadığını sorarsanız, "kesinlikle hayır" ya da "neredeyse kesinlikle evet" cevabını verir. Çok fazla yanlış pozitif elde ederseniz, veritabanını büyütün.

Kullanıcının Soru ve Yanıt'ı tam olarak istediğiniz gibi heceleyeceğini varsayarak küçük bir alanda çok büyük bir veritabanına sahip olabilirsiniz. Veritabanını küçük tutmak güncellemelere yardımcı olur, çünkü muhtemelen kablosuz ağlar üzerinden aktarılmaları gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.